当前位置: 首页 > web >正文

SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像

需求:将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,建议:
  1. 使用 2376 + TLS 认证;
  2. 或者通过 SSH 隧道代理访问;
  3. 或者限制 IP 白名单;
  4. 更推荐使用 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.jarWORKDIR /
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

运行和手动一样,都是成功这里不在演示

http://www.xdnf.cn/news/5242.html

相关文章:

  • gvm安装go报错ERROR: Failed to use installed version
  • Linux进程信号的捕捉处理方式
  • 【Java学习】枚举(匿名类详解)
  • 基于大模型的新型隐球菌脑膜炎智能诊疗全流程系统设计与实现的技术方案文档
  • CD37.【C++ Dev】string类的模拟实现(上)
  • fastmcp: 更好用的 MCP Python 框架
  • SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析
  • 指针运算典型例题解析
  • IOC和Bean
  • 【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
  • Android方法耗时监控插件开发
  • Java 基础面试题
  • 自定义类型-结构体(一)
  • 【Rust】枚举和模式匹配
  • 2025年数维杯赛题C题专家 组委会C题专家疑集锦
  • 5.8线性动态规划2
  • SpringMVC-执行流程
  • 40、C# 数组、链表、哈希、队列、栈数据结构的特点、优点和缺点
  • AI:生成对抗网络(GAN)
  • 【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
  • yocto的大致工作流程
  • CSS渲染性能优化
  • MySQL进阶篇2_SQL优化、锁
  • 探索 JWT(JSON Web Token):原理、结构与实践应用对比
  • RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
  • C# 使用 WinUI 3 项目模板创建桌面应用程序
  • 在 Kubernetes 中使用 Docker 实现 GPU 支持的完整方案
  • Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
  • 添加物体.
  • 2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证