随着微服务的发展,服务docker化成为潮流,本文记录下将SpringBoot项目打包为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
$ 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
构建一个Springboot项目,进行Docker镜像打包配置。
服务本地IDEA运行访问Swagger界面如图:
在项目pom.xml中添加如下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.1.1.RELEASEversion>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>3.1.0version>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.2.0version>
<executions>
<execution>
<id>build-imageid>
<phase>packagephase>
<goals>
<goal>buildgoal>
goals>
execution>
executions>
<configuration>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jarJAR_FILE>
buildArgs>
<dockerHost>http://192.168.4.56:2375dockerHost>
<imageName>${project.build.finalName}imageName>
<imageTags>
<imageTag>${project.version}imageTag>
imageTags>
<baseImage>javabaseImage>
<dockerDirectory>${project.basedir}/src/main/dockerdockerDirectory>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
<forceTags>trueforceTags>
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
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
查看菜鸟教程说明