SpringBoot项目打包为Docker镜像
随着微服务的发展,服务docker化成为潮流,本文记录下将SpringBoot项目打包为Docker的全过程,留作记录。
目录:
1、准备docker私服环境
2、服务docker打包配置
3、服务打包&运行验证
4、拉取私服镜像到本地
5、Docker相关指令
准备docker私服环境
准备一台服务器或虚拟机为Docker私服仓库,具体操作可参照【Docker环境配置】环境准备好后开放Docker API端口,供服务打包时的镜像上传。以及基础镜像准备。
开放docker私服API端口
在/usr/lib/systemd/system/docker.service中的【Service】-【ExecStart】中添加-H tcp://127.0.0.1:2375 如下:
$ sudo vi /usr/lib/systemd/system/docker.service
重新加载systemctl配置
$ sudo systemctl daemon-reload
重启Docker
$ sudo systemctl restart docker.service
查看netstat确认的输出是否dockerd正在侦听已配置的端口
$ sudo netstat -lntp | grep dockerd
如图则为操作成功
下载基础镜像(按需下载)
$ docker pull java:8
等待下载成功即可,注意若是虚拟机的话内存和磁盘均不可太小,否则会出现下载失败或者docker的服务运行失败等问题。
开启防火墙 构建端口(也可直接关闭防火墙)
$ firewall-cmd --zone=public --add-port=2375/tcp --permanent
$ firewall-cmd --reload
服务docker打包配置
构建一个Springboot项目,进行Docker镜像打包配置。
服务本地IDEA运行访问Swagger界面如图:
在项目pom.xml中添加如下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- Docker 打包上传 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--buildArgs用于Dockerfile文件中 -->
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<!-- 步骤1中的docker私服的地址 -->
<dockerHost>http://192.168.4.56:2375</dockerHost>
<!-- imageName不能有大写字母 -->
<imageName>${project.build.finalName}</imageName>
<!--TAG,这里用工程版本号,修改项目重新构建镜像时请修改${project.version} -->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--依赖的基础镜像 -->
<baseImage>java</baseImage>
<!--Dockerfile的位置 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像 -->
<forceTags>true</forceTags>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
构建Dockerfile(注意:没有文件格式后缀)
# 服务运行所需基础依赖
FROM java:8
# 作者信息
MAINTAINER zp app@xxx.com
# 数据卷挂载地址
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
RUN bash -c 'touch /app.jar'
#设置时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 容器运行端口
EXPOSE 8082
# java运行环境配置(非必须)
ENV JAVA_OPTS="\
-server \
-Xms2048m \
-Xmx2048m \
-Xmn512m \
-XX:SurvivorRatio=8 \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=256m \
-XX:ParallelGCThreads=4 \
-XX:+PrintGCDetails \
-XX:+PrintTenuringDistribution \
-XX:+PrintGCTimeStamps \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/ \
-XX:+DisableExplicitGC \
-XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC \
-XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled \
-XX:LargePageSizeInBytes=128M \
-XX:+UseFastAccessorMethods \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:CMSInitiatingOccupancyFraction=80 \
-XX:SoftRefLRUPolicyMSPerMB=0 \
-XX:+PrintClassHistogram \
-XX:+PrintHeapAtGC \
-XX:+UnlockDiagnosticVMOptions \
-XX:+UnlockExperimentalVMOptions \
-XX:+PrintFlagsFinal \
-XX:GCLogFileSize=10M"
#运行docker是启动服务
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
注意如上配置中的地址和资源路径,需对应。
服务打包&运行验证
在IDEA中的Terminal中进行mvn打包构建操作:
mvn clean install -Dmaven.test.skip=true
或者在电脑对应项目所在盘符路径中进行CMD运行以上指令打包。
打包指令完成后如图:
在到docker私服仓库中进行查看:
出现和服务配置相同的镜像则说明服务Docker镜像打包成功。
运行该镜像进行服务访问验证。
运行指令:
docker run -it -d --name doc --restart=always -p 8082:8082 documents:1.0
–name doc是对该镜像运行取的容器名称,可通过该名称查看运行的相关日志,若运行失败则通过日志进行排查:
docker logs doc
运行完成如图:
在浏览器中通过Docker私服访问该服务验证如图:
自此SpringBoot服务打包Docker镜像完成。
拉取私服镜像到本地
将私服上的docker镜像打包出来,供其他服务器运行使用:
$ docker save documents:1.0 -o /home/zp/docker_tar/documents.tar
运行完成后在对应的目录下下载下该tar即可在其他服务器上使用,使用前先加载该镜像
$ docker load -i share-documents.tar
Docker相关指令
1.查看当前运行的所有容器
docker ps -a
2.停止所有容器(container),这样才能够删除其中的images:
docker stop $(docker ps -a -q)
3.如果想要删除所有容器(container)的话再加一个指令:
docker rm $(docker ps -a -q)
若这样删除失败可采用
docker rmi -f image_ID
4.查看当前有那些镜像(images)
docker images