Bootstrap

将SpringBoot项目打包为Docker镜像

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

Dockerfile相关配置

查看菜鸟教程说明

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;