Docker编排SpringCloud微服务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15144655/article/details/85062361

运行环境

操作系统:windows 10 企业版

docker for windows:2.0.0.0-win81

docker engine:18.09.0

docker compose:1.23.2

springboot项目构建docker镜像

maven添加构建docker插件

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
        //要生成的docker镜像的名称
        <repository>${docker.image.prefix}/${project.artifactId}</repository>
    </configuration>
</plugin>
//将jar解压成目录结构
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

在项目根目录(与pom.xml同级)下添加Dockerfile,如:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
EXPOSE 8070
ENTRYPOINT ["java","-cp","app:app/lib/*","${springboot项目的启动类}"]

上面的Dockerfile一定要把${springboot项目的启动类}替换为自己项目的启动目录如com.xiaoyang.Application,其中Application是项目的启动类。

将项目打包打包成docker镜像

  1. 方法一:可以直接使用命令(需要配置maven环境变量):

    mvn clean package dockerfile:build
    

    可能会出现的问题,如:

    [ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.3.6:build (default-cli) on project crm_service_member: Could not build image: java.util.concurrent.ExecutionException:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]
    

    解决发放(docker for windows)在没有TLS的tcp:// localhost:2375上公开守护进程,如图设置docker for windows :

  2. 方法二,如果方法一实在不能行可以使用方法二(略麻烦,但可以跳过方法一说所的问题):

    第一步、先编译好项目,在项目根目录下:

    mvn clean package
    

    第二步、直接使用docker命令运行Dockerfile生成镜像:

    docker build -t [IMAGE_NAME]:[TAG] PATH
    如:docker build -t config:v1 .
    

    IMAGE_NAME:docker镜像名

    TAG:docker镜像tag

    PATH:Dockerfile所在路径

  3. 其他:可以直接使用IDEA的工具运行指令。

docker-compose服务编排

当所有要发布的项目都打包编译好生成docker镜像后,就可以统一使用docker-compose进行服务的编排。

在项目根目录下建立docker-compose.yml,内容如:

eureka:
  image: spring-cloud-eureka
  ports:
  - 8070:8070
config:
  image: spring-cloud-config
  ports:
  - 8072:8072
  links:
  - center
user:
  image: user-server
  ports:
  - 8081:8081
  links:
  - center
  - config

说明:

  • eureka、config、user是发布的别名,不固定
  • image是要发布的docker镜像名
  • ports是docker服务的端口转发
  • links是当前运行的docker镜像需要访问的docker镜像

对服务的修改

​ docker镜像与docker镜像之间访问要采用别名,如config要访问eureka

​ 使用别名如:

eureka:
    instance:
        prefer-ip-address: true
    client:
      registerWithEureka: true
      fetchRegistry: true
      serviceUrl:
          defaultZone: http://center:8070/eureka/

调用配置中心类似

docker-compose启动顺序问题

当我们有多个服务相互依赖,有的时候会出现当前容器所依赖的服务没有启动完成导致当前容器启动失败,如上述的docker-compose.yml的方式构建就会出现这种情况。

使用depends_on指定依赖服务,使用restart重启服务,如:

version: "3"
services:
  eureka:
    image: spring-cloud-eureka
    ports:
    - 8070:8070
    restart: always

  config:
    image: spring-cloud-config
    ports:
    - 8072:8072
    depends_on:
    - eureka

  user:
    image: user-server
    restart: always
    ports:
    - 8081:8081
    depends_on:
      - eureka
      - config

其中restart:always代表重启,always表示一直重启,如果启动失败会重新启动,一直失败也会一直重新启动

参考资料
http://spring.io/guides/gs/spring-boot-docker/
https://docs.docker.com/compose/overview/

猜你喜欢

转载自blog.csdn.net/qq_15144655/article/details/85062361