docker编排SpringCloud微服务
运行环境
操作系统: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镜像
-
方法一:可以直接使用命令(需要配置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 :
image
-
方法二,如果方法一实在不能行可以使用方法二(略麻烦,但可以跳过方法一说所的问题):
第一步、先编译好项目,在项目根目录下:
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所在路径
-
其他:可以直接使用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/