Spring Cloud基于Docker进行打包部署2-基于docker compose做应用编排/构建mysql数据库镜像

1、安装docker-compose

  • 通过联网机器下载docker-compose离线安装包(参见Downloads部分) https://github.com/docker/compose/releases
  • 将下载的文件上传到待安装服务器(推荐工具:FileZilla)
  • 重命名 sudo mv docker-compose
  • 更改文件目录 sudo mv docker-compose /usr/local/bin/docker-compose
  • 修改文件用户名用户组 (或修改访问权限)cd /usr/local/bin/     chmod 755 docker-compose
  • 验证是否安装成功 docker-compose --version
  • 安装成功 docker-compose version 1.12.0, build b31ff33

docker compose在线安装参见 https://docs.docker.com/compose/install/

2、卸载docker-compose

如果是二进制包方式安装的,删除二进制文件即可。 rm /usr/local/bin/docker-compose

3、已经有镜像,使用docker-compose进行容器的启动

编写docker-compose.yml配置文件:

version: '3'
services:
  athena-eureka:
    image: athena/athena-eureka
    restart: always
    ports:
      - 8761:8761

  athena-gateway:
    image: athena/athena-gateway
    restart: always
    ports:
      - 8765:8765
在docker-compose.yml所在目录下,执行命令:docker-compose up -d 创建并后台执行服务。

这样,eureka服务和gateway服务就启动了,在页面上可以访问注册中心,而且可以看到gateway服务已注册。

4、无镜像,使用docker-compose创建镜像并启动

(1)每个微服务的pom中加入打包插件(跟上一篇文章的一样):

  
      
          
            org.springframework.boot  
            spring-boot-maven-plugin  
          
          
          
            com.spotify  
            docker-maven-plugin  
            0.4.13  
              
                mambo/${project.artifactId}  
                ${project.basedir}/src/main/docker  
                  
                      
                        /  
                        ${project.build.directory}  
                        ${project.build.finalName}.jar  
                      
                  
              
          
          
      
 

(3)在最外层的pom中加入以下编译插件即可在一键执行所有模块的打包插件,使用mvn clean package -DskipTests 命令打jar包(忽略测试代码),这样所有服务的jar包都生成了:

    
    
        org.apache.maven.plugins
        maven-compiler-plugin
        3.7.0
        
            1.8
            1.8
            UTF8
        
    

(4)将打包好的.jar文件和每个对应模块的Dockerfile整理好,整理好的目录结构如下:athena_package

 
  
├── docker-compose.yml
├── athena-eureka
│     athena-eureka-1.0.jar
|     Dockerfile
├── athena-gateway
│     athena-gateway-1.0.jar
|     Dockerfile
├── athena-keystone
│     athena-keystone-1.0.jar
|     Dockerfile
├── athena-webapp
│     athena-webapp-1.0.jar
|     Dockerfile
|----- athena-mysql-server
|   |    Dockerfile
|   |----mysql
           init_table.sql
           init_data.sql
           install_db.sh

(5)编写用于构建docker image的docker-compose.yml配置文件:

 
  
version: '3'
services:
  athena-eureka:
    build: athena-eureka
    ports:
      - 8761:8761

  athena-gateway:
    build: athena-gateway
    ports:
      - 8765:8765
 
  athena-mysql-server:
    build: athena-mysql-server
    ports:
      - 3308:3306
  athena-keystone:
    build: athena-keystone
    ports:
      - 8881:8881
  athena-webapp:
    build: athena-webapp
    ports:
      - 8883:8883

(6)执行命令

docker-compose -f docker-compose.yml  up 

(7)镜像会自动创建并启动容器,页面可以访问各个应用

5、athena-mysql-server镜像的构建:

(1)下载mysql官方数据库镜像。

我们需要使用官方镜像融合数据库初始化脚本来制作新的数据库镜像,本文使用mysql:5.7版本的镜像。

(2)编写Dockerfile

mysql官方镜像可以支持在容器启动时自动遍历docker-entrypoint-initdb.d目录下所有的.sh和.sql后缀的文件并执行。但是执行是没有顺序的,不太符合我们的要求。解决方法就是编写一个shell脚本,脚本中定义sql文件执行的顺序。

#基础镜像
FROM mysql:5.7

#定义工作目录
ENV WORK_PATH /usr/local/work

#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义sql文件名
ENV FILE_1 init_table.sql
ENV FILE_2 init_data.sql

#定义shell文件名
ENV INSTALL_DB_SHELL install_db.sh

#创建文件夹
RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下
COPY .mysql/$FILE_1 $WORK_PATH/
COPY .mysql/$FILE_2 $WORK_PATH/

#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SHELL

shell脚本如下:

mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2; 

(3)然后就可以使用上面的docker-compose命令来构建镜像、启动容器了,当然也可以使用docker命令:

构建镜像:

docker build -t athena-mysql-server .

启动容器:

docker run --name mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=1q2w3e -d athena-mysql-server

你可能感兴趣的:(微服务)