SpringBoot微服务项目打包成Docker镜像详解
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot微服务项目打包成Docker镜像详解相关的知识,希望对你有一定的参考价值。
SpringBoot微服务项目打包成Docker镜像详解
SpringBott打包成Docker镜像的两种方式
- 将springboot项目打成一个jar包,上传linux服务器指定目录下,然后再对应的目录下编写一个Dockefile文件,然后进行打包
- IDEA集成Docker插件,通过maven的docker插件,远程打包成镜像弄到linux上,并且可以在本机的IDEA中操作容器和镜像
下面介绍的是第二种方式,而不是第一种
第一步: 配置Docker的远程访问
1.修改 /usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
2.替换ExecStart
将
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
替换为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3.重启Docker服务
systemctl daemon-reload
systemctl restart docker
4.查看2375端口是否被监听
netstat -nlpt
5.服务器防火墙开启2375端口
firewall-cmd --add-port=2375/top --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
6.检查是否配置好
linux主机ip加2375端口号/version,如果出来了东西,表示配置成功
IDEA配置
Docker插件安装,并设置远程docker的地址
pom.xml添加maven-docker插件,自动生成镜像,并推送到仓库
如果使用maven-docker插件,可以选择在configuration标签中指定dockerfile的文件位置,也可以在configuration中自己配置替代dockerfile文件
下面第一种是指定dockfile文件的位置:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--进行相关配置-->
<configuration>
<!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--指定生成的镜像名: 前缀/项目名称-->
<imageName>xfx/${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 远程docker的地址-->
<dockerHost>Http://192.168.112.128:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile 中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
对应的Dockerfile文件
#基础镜像通过java8来的
FROM java:8
#挂载卷是临时目录
VOLUME /tmp
#将Demo1-520.finnally.jar.jar 拷贝到容器内的的Demo1-520.finnally.jar.jar中(这个Demo1-520.finnally.jar.jar是自己生成的)
COPY target/Demo1-520.finnally.jar /xfx.jar
#暴露端口
EXPOSE 80
#执行命令java -jar
ENTRYPOINT ["java","-jar","/xfx.jar"]
这里COPY的相对路径,是从当前Dockerfile所在目录开始
COPY target/Demo1-520.finnally.jar /xfx.jar
完全替代dockerfile文件
<properties>
<java.version>1.8</java.version>
<docker.image.prefix>xfx</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<!-- springboot用来生成jar包的插件-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!-- configuration替代编写的Dockerfile文件 -->
<configuration>
<!-- 指定基础镜像-->
<baseImage>java</baseImage>
<!-- 创作者本人的信息-->
<maintainer>dhy dhy@qq.com</maintainer>
<!-- 切换到root目录-->
<workdir>/ROOT</workdir>
<!-- 执行的命令-->
<cmd>["java","-version"]</cmd>
<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
<!-- 指定Dcokerfile路径,${project.basedir}:项目根路径-->
<!-- <dockerDirectory>${project.basedir}</dockerDirectory>-->
<!--指定生成的镜像名: 镜像名前缀/项目名称-->
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<!-- 可替换为当前项目的版本号-->
<imageTag>${project.version}</imageTag>
</imageTags>
<!-- 远程docker api 地址-->
<dockerHost>Http://192.168.112.128:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<!-- 放到容器哪个目录下面-->
<targetPath>/ROOT</targetPath>
<!-- 用于指定需要复制的根目录-->
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 用于指定需要复制的文件-->
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile 中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
如上用docker-maven插件,自动生成如下文件:
FROM java
MAINTAINER dhy dhy@qq.com
WORKDIR /ROOT
ADD /ROOT/Demo1.jar /ROOT/
ENTREPOINT ["java","-jar","Demo1.jar"]
CMD ["java","-version"]
执行mvn命令
mvn clean package docke:build
清理,打包,构建
执行mvn命令,有点繁琐,可以绑定插件的运行时间到maven执行打包的生命周期阶段
将Docker命令绑定到maven各个阶段
我们可以把Docker分为build,tag,push,然后分别绑定到Maven的package,deploy阶段
我们只需要执行mvn deploy就可以完成build,tag,push操作,当我们执行mvn build就只完成build,tag操作
<executions>
<!--当执行mvn package时,执行 mvn clean package docker:build-->
<execution>
<id>build-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<!--当执行mvn package时,会对镜像进行标签设定-->
<execution>
<id>tag-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:tag-->
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>${docker.image.prefix}/${project.artifactId}:latest</image>
<newName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}</newName>
</configuration>
</execution>
<!--当执行mvn deploy 时,执行 mvn deploy docker:push-->
<execution>
<id>push-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:push-->
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
参考文章
一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!
springboot 整合 docker, 进行自动化部署,其实没你想象的那么难
以上是关于SpringBoot微服务项目打包成Docker镜像详解的主要内容,如果未能解决你的问题,请参考以下文章
DOCKER06_SpringBoot微服务项目打包成Docker镜像详解
docker -SpringBoot微服务打包Docker镜像