需求:将Spring Boot项目使用容器化进行部署
- 前提 默认其他环境,如mysql,redis等已经通过docker部署完毕, 这里只讨论,如何制作springboot项目的镜像
要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像
一、手动 dockerfile构建镜像
有一个更基础的入门教程,见通过dockerfile构建jdk17的环境🔗教程链接,这次也以这个jdk17的环境为基础
1、 项目打包
1.、打包一个我们自己写的springboot项目为可执行的jar
需要在pom.xml中引入插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.0.5</version> <!-- 使用与你的 Spring Boot 版本匹配的版本 -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
<!-- repackage 目标会把普通的 JAR 转换为可执行的 Spring Boot JAR。-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2、 点击install会在target目录生成可执行jar
先在本地跑一试试, 记得把idea中项目停掉,否则会占用端口, 我这个项目设置的端口为8080, 进到springboot-demo-1.0-SNAPSHOT.jar 所在目录
执行
java -jar springboot-demo-1.0-SNAPSHOT.jar
3、没啥问题上传jar包到linux服务器上
2、 dockerfile文件
jar包同级目录下创建dockerfile文件的内容如下所示:
#这个mycentos-jdk17是基础入门中,自己制作的镜像, 我们要依赖此镜像
FROM mycentos-jdk17
#作者
MAINTAINER cgj
# 声明容器内主进程所对应的端口, 端口映射的时候要用 -p 宿主机端口:容器内端口 ,expose设置的就是容器内端口
EXPOSE 8080
# 文件添加进来, add 源 目的
#复制文件到容器linux的根目录
ADD springboot-demo-1.0-SNAPSHOT.jar /springboot-demo-1.0-SNAPSHOT.jar
# 相当于windows中的cd命令
WORKDIR /
#容器一启动, boot项目就运行起来了
ENTRYPOINT ["java" , "-jar" , "springboot-demo-1.0-SNAPSHOT.jar"]
3、构建镜像
当前目录命令如下所示:
docker build -t myfirstboot:v1 .
myfirstboot 为容器名:版本号 (可不写)
用docker images命令可以查看镜像
4、创建容器
命令如下所示:
docker run -d --name boot -p 8080:8080 myfirstboot:v1
访问测试: http://你linux的ip:映射的端口
如果你用的是云服务器,记得防火墙放开对应的端口.
停掉容器
docker stop 容器名
docker stop boot
二、自动 Maven的docker插件
刚才的构建过程是手动镜像构建的过程。使用Maven的docker插件可以实现镜像的自动化部署。
步骤:
1、在pom.xml文件中添加Maven的docker插件
2、开启docker服务端的远程访问
3、在工程的根目录下创建dockerfile文件
4、使用maven的打包命令进行打包
5、创建容器并访问
实操:
1、在pom.xml文件中添加Maven的docker插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase(阶段)上。也就是说,用户只需执行mvn package,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名-->
<imageName>${project.artifactId}</imageName>
<!--指定标签,也就是版本号,可以自定义-->
<imageTags>
<imageTag>v2.0</imageTag>
</imageTags>
<!--指定远程 docker api地址 也就是服务器ip+docker的端口号-->
<dockerHost>http://yourip:2375</dockerHost>
<!-- 指定 dockerfile 路径-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!-- 是否跳过docker构建 -->
<skipDockerBuild>false</skipDockerBuild>
</configuration>
</plugin>
2、docker服务端开启远程访问
#修改该文件
vim /lib/systemd/system/docker.service
#找到ExecStart行,修改成如下内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
systemctl daemon-reload #重启守护进程
systemctl restart docker #重启docker
- 安全问题: 如果你没有公网ip,此步骤可以跳过
2375:这是 Docker 守护进程(dockerd)默认监听的端口,用于提供 HTTP 明文通信 的远程管理接口。如果你将 Docker 的 2375 端口暴露在公网,风险极大,因为任何人都可以不需要身份验证地远程控制你的 Docker 容器(包括运行恶意镜像、提权、访问主机文件系统等)。如果要启用远程 API,建议:
- 使用 2376 + TLS 认证;
- 或者通过 SSH 隧道代理访问;
- 或者限制 IP 白名单;
- 更推荐使用 Docker Socket Proxy 结合认证和限权机制
我这里采用的是白名单, 也就是此端口只对对应的ip开放,
docker中配置,另外我在腾讯云的策略组中也进行了限制
3、编写dockerfile文件
- 该文件的位置必须是和pom.xml处于同一个目录
FROM mycentos-jdk17
MAINTAINER cgj
EXPOSE 8080
ADD target/springboot-demo-1.0-SNAPSHOT.jar /springboot-demo-1.0-SNAPSHOT.jar
WORKDIR /
ENTRYPOINT ["java" , "-jar" , "springboot-demo-1.0-SNAPSHOT.jar"]
4.制作并查看镜像
先clean, 然后直接使用install即可
✅ 两个镜像标签的解释:
你构建的镜像被打了 两个标签(tags):
1. springboot-demo:latest
• 这是默认标签。
• 如果你没有显式指定 tag,Docker 会自动加上 latest。
2. springboot-demo:v2.0
• 这是你在构建脚本、配置文件或命令中明确指定的版本号标签。
• 比如 Maven 插件配置了
<tag>v2.0</tag>
🧱 Docker 标签不是副本,而是“指针”
Docker 镜像的 tag 其实是 指向镜像 ID(68ac058f9d16)的名字别名,所以这两个 tag 其实指向的是同一个镜像:
可以删除一个 tag,不影响另一个。
docker rmi springboot-demo:latest
5、创建容器并进行访问
docker run -d --name bootv2 -p 8080:8080 springboot-demo:v2.0
运行和手动一样,都是成功这里不在演示