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

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

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

相关文章:

  • [杂谈随感-13]: 人的睡眠,如何布置床的位置比较有安全?感?
  • java命令行打包class为jar并运行
  • 基于人工智能的个性化 MySQL 学习路径推荐研究
  • Linux——Mysql索引和事务
  • 基于FPGA的PID控制器verilog实现,包含simulink对比模型
  • ffmpeg 写入avpacket时候,即av_interleaved_write_frame方法是如何不需要 业务层释放avpacket的 逻辑分析
  • 2003-2020年高铁线路信息数据
  • 第七章 数据库编程
  • 机器学习第四讲:无监督学习 → 给无标签积木自由组合,发现隐藏规律
  • redis sentinel和redis cluster的主从切换选举过程
  • 77.评论日记
  • Unity基础学习(十)Camera组件
  • 【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
  • milvus+flask山寨复刻《从零构建向量数据库》第7章
  • 常见的降维算法
  • 右值引用的剖析
  • OpenCv实战笔记(4)基于opencv实现ORB特征匹配检测
  • SpringCloud之Ribbon基础认识-服务负载均衡
  • MySQL索引与事务
  • 游戏引擎学习第268天:合并调试链表与分组
  • 网站后台登陆口/杭州网络
  • 建设网站要先给钱才能做/今日微博热搜榜前十名
  • 网站建设如果没有源代码/海东地区谷歌seo网络优化
  • 网站建设需要掌握什么知识/自己搭建一个网站
  • 怎么快速建动态网站/网络营销软件下载
  • jmail官方网站/房地产十大营销手段