Docker部署Springboot微服务

284 阅读3分钟

上图是我绘制的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

如果在实现的方案中,有存在不妥的地方,或者大家有更好的方案,希望可以私信交流下。^_^

本人也是作为初学者,会在后面的工作中持续优化。