上图是我绘制的Docker部署Springboot微服务的整体流程,从开发开始说起:
代码开发 -> 提交GitHub -> Jenkins拉取代码 -> 构建镜像 -> 推送镜像 -> 部署服务 -> Docker服务器拉取镜像 -> 启动
Docker安装Jenkins在前面 东小西:Docker安装Jenkins 已经写过了,本帖主要是镜像构建、一键式部署Springboot微服务。
构建镜像
微服务的镜像构建有两种方法:
- 手动构建:先将微服务工程源码打包生成Jar包,编写Dockerfile文件,基于基础镜像构建新镜像,将Jar包上传至虚拟机并拷贝到容器,这种方式着实有些麻烦。
- 自动构建:通过Docker-Maven-Plugin插件实现自动构建,配置好pom.xml后,运行一句MVN指令就完成镜像构建。
手动构建
Linux服务器所需的基础环境:
- 已安装Docker
- 已拉取java8镜像(docker pull java:8)
(1)编写Dockerfile(名称必须为Dockerfile)文件
#基础镜像
FROM java:8
#镜像作者
MAINTAINER dongxiaoxi
#将项目 springboot-docker.jar 加入并且重命名
ADD springboot-docker.jar app.jar
#启动工程
ENTRYPOINT ["java","-jar","/app.jar"]
(2)将docker项目包和Dockerfile一起上上传到服务器同一个目录下,进入后构建镜像
docker build . -t 192.168.2.100:5000/springboot-docker:0.0.1-SNAPSHOT
(3)将镜像上传至私服仓库
docker push 192.168.2.100:5000/springboot-docker:0.0.1-SNAPSHOT
自动构建
在使用Docker-Maven-Plugin插件实现自动化部署的时候,有两种方式:
- 一种是编写Dockerfile,在pom.xml配置Docker-Maven-Plugin插件的时候,引入Dockerfile文件路径。
- 一种是直接在pom.xml配置Docker-Maven-Plugin插件时候,编写 Dockerfile 对应的标签完成配置。
举个栗子:
- DockerFile:FROM java:8
- pom.xml:java:8
由于微服务个数太多,并且pom.xml可以直接使用工程相关参数,比如说工程名、版本等。所以能用一个解决就不用俩^_^,直接上代码:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--镜像名称改为私有仓库地址和端口,后面直接上传到私服仓库-->
<imageName>192.168.2.100:5000/${project.artifactId}</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<baseImage>java:8</baseImage>
<!--用来配置Jar启动的Jvm参数,如-Xmx -->
<env>
<JAVA_OPTS></JAVA_OPTS>
</env>
<entryPoint>java $JAVA_OPTS -jar ${project.build.finalName}.jar</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<!--把文件上传到docker,相当于Dockerfile里的add app.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<registryUrl>192.168.2.100:5000</registryUrl>
<dockerHost>http://192.168.2.100:2375</dockerHost>
<pushImage>true</pushImage>
<forceTags>true</forceTags>
</configuration>
</plugin>
- Push到私服仓库
<!-- 增加私服仓库地址-->
<registryUrl>[IP]:5000</registryUrl>
<!-- 开启镜像推送 -->
<pushImage>true</pushImage>
<!-- 开启覆盖镜像 -->
<forceTags>true</forceTags>
- 运行mvn指令,完成镜像构建与私服仓库推送
# docker:build绑定到mvn package,执行指令,构建镜像
mvn clean package
#有些时候,根据需求,可能只是打个普通的jar包,跳过构建镜像等一系列Docker操作
#跳过 build 镜像
-DskipDockerBuild
#跳过 tag 镜像
-DskipDockerTag
#跳过 push 镜像
-DskipDockerPush
#跳过整个阶段
-DskipDocker
执行日志
[INFO] Building image 192.168.2.100:5000/springboot-docker
Step 1/3 : FROM 192.168.2.100:5000/dp-jdk8:0.192
---> 6177f77411fb
Step 2/3 : ADD /springboot-docker-1.0-SNAPSHOT.jar //
---> b4ddeb81a04b
Step 3/3 : ENTRYPOINT ["java", "-jar", "springboot-docker-1.0-SNAPSHOT.jar"]
---> Running in 34ca0701d82f
Removing intermediate container 34ca0701d82f
---> d020adb53b5f
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built d020adb53b5f
Successfully tagged 192.168.2.100:5000/springboot-docker:latest
[INFO] Built 192.168.2.100:5000/springboot-docker
[INFO] Tagging 192.168.2.100:5000/springboot-docker with 1.0-SNAPSHOT
[INFO] Tagging 192.168.2.100:5000/springboot-docker with latest
[INFO] Pushing 192.168.2.100:5000/springboot-docker
The push refers to repository [192.168.2.100:5000/springboot-docker]
Jenkins一键式部署
镜像构建与私服仓库推送通过Docker-Maven-Plugin都已实现了,所谓万事俱备,只欠东风。那么东风便是提前安装好的Jenkins。
整体流程是:git pull -> mvn package -> docker service update
由于我的微服务是由service部署的(至于如何使用service或stack部署微服务,可看一下这篇文章:juejin.cn/post/712465… ),通过docker service update 实现重启service完成服务滚动升级。
docker service update --force demo_service
如果在实现的方案中,有存在不妥的地方,或者大家有更好的方案,希望可以私信交流下。^_^
本人也是作为初学者,会在后面的工作中持续优化。