SpringBoot-Docker容器化部署发布
在生产环境都是怎么部署 Spring Boot?
- 打成 jar 直接一键运行
- 打成 war 扔到 Tomcat 容器中运行
- 容器化部署
一、准备Docker
在 CentOS7 上安装好 Docker
修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,加入如下内容:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

配置完成后,保存退出,然后重启 Docker:
systemctl daemon-reload
service docker restart
二、IDEA中安装Docker插件
点击 File->Settings->Plugins->Browse Repositories 如下:

点击右边绿色的 Install 按钮,完成安装,安装完成之后需要重启一下 IDEA。
IDEA 重启成功之后,我们依次打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:

配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。
三、创建项目
Spring Boot 项目(只需要引入 spring-boot-starter-web 依赖即可)
@RestController
public class HelloDockerController {@GetMapping("/hello")public String hello() {return "hello docker!";}
}
四、配置Dockerfile
在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:

文件内容如下:
FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- Spring Boot 项目的运行依赖 Java 环境,所以自己的镜像基于 Java 镜像来构建
- 考虑到 Docker 官方镜像下载较慢,我这里使用了网易提供的 Docker 镜像。
- 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来
- 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
- 最后就是配置一下启动命令,由于我打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar
五、配置Maven插件
<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 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置--><configuration><dockerHost>http://192.168.66.131:2375</dockerHost><imageName>javaboy/${project.artifactId}</imageName><imageTags><imageTag>${project.version}</imageTag></imageTags><forceTags>true</forceTags><dockerDirectory>${project.basedir}</dockerDirectory><!--最后 resource 节点中再配置一下 jar 的位置和名称即可--><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>
六、打包运行
接下来对项目进行打包,打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中,打包方式如下:

打包过程会稍微有一点旧,因为还包含了镜像的构建,特别是第一次打包,需要下载基础镜像,会更慢一些。
部分打包日志如下(项目构建过程):

项目打包成功之后,我们就可以在 Docker 容器中看到我们刚刚打包成的镜像了,如下:

运行方式一:
此时,我们可以直接在 Linux 上像创建普通容器一样创建这个镜像的容器,然后启动,执行如下命令即可:
docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1
启动成功之后,我们就可以访问容器中的接口了。
但是这种操作显然还是有点麻烦,结合我们一开始安装的 Docker 插件,这个运行步骤还可以做进一步的简化。
运行方式二:
此时我们的 IDEA 中多了一个选项,就是 docker,如下:

点击左边的绿色启动按钮,连接上 Docker 容器,连接成功之后,我们就可以看到目前 Docker 中的所有容器和镜像了,当然也包括我们刚刚创建的 Docker 镜像,如下:

此时,我们选中这个镜像,右键单击,即可基于此镜像创建出一个容器,如下图:
选择 Create container,然后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 即可,然后写上端口的映射关系:

配置完成后,点击下方的 run 按钮,就可以开始运行了。运行日志如下:

注意,这个日志是在 Docker 的那个窗口里打印出来的。
项目运行成功之后,在浏览器输入远程服务器的地址,就可以访问了:

Spring Boot 项目就算顺利发布到远程 Docker 容器中
使用 Jib 部署 Spring Boot
一个小小的 helloworld 构建成镜像之后,竟然都有 660 MB+
所以采用另一种方案Jib,这是谷歌开源的一个容器化运行方案,使用它我们将 Spring Boot 进行容器化部署只要两步:
- 配置Maven Plugin
- 构建
开发人员可以不需要任何 Docker 相关的技能,就能将 Spring Boot 项目构建成 Docker 中的镜像,而且还可以“顺便”将镜像 push 到 register 上,极大的简化了部署过程。
利用镜像分层和注册表缓存来实现快速、增量的构建。
Jib 会自动读取项目的构建配置,代码组织到不同的层(依赖项、资源、类)中,然后它只会重新构建和推送发生变更的层。在项目进行快速迭代时,Jib 只将发生变更的层推送到 registers 来缩短构建时间
一、准备一个Docker Hub账号(https://hub.docker.com/)注册
二、创建SpringBoot工程

@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "hello jib";}
}
在 pom.xml 中添加上 Jib 的插件,如下:
<!--首先就是版本号的问题,这里使用的是 1.7.0 ,网上有的教程比较老,用的 0.x 的版本,老的版本在配置 Docker 认证的时候非常麻烦,所以版本这块建议大家使用当前最新版。-->
<plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>1.7.0</version><configuration><from><!--from 中的配置表示本镜像构建所基于的根镜像为 openjdk:alpine--><image>openjdk:alpine</image></from><to><!--o 中的配置表示本镜像构建完成后,要发布到哪里去.如果是发布到私有镜像站,就写自己私有镜像站的地址,如果是发布到 Docker Hub 上,就参考这里的写法 docker.io/wongsung/dockerjib,其中 wongsung 表示你在 Docker Hub 上注册的用户名,dockerjib 表示你镜像的名字,可以随意取--><image>docker.io/wongsung/dockerjib</image><tags><!--tags 中配置的是自己镜像的版本--><tag>v1</tag></tags><auth><!--auth 中配置你在 Docker Hub 上的用户名/密码--><username>wongsung</username><password>你的密码</password></auth></to></configuration><executions><execution><phase>package</phase><goals><goal>build</goal></goals></execution></executions>
</plugin>
配置完成后,在命令行执行如下命令将当前下项目构建成一个 Docker 镜像并 push 到 Docker Hub:
mvn compile jib:build
构建完成后,我们在 Docker Hub 上就能看到自己的镜像了:

接下来,启动 Docker ,在 Docker 中执行如下命令拉取镜像下来并运行:
docker run -d --name mydockerjib -p 8080:8080 docker.io/wongsung/dockerjib:v1

【注意】
这种方式是将项目构建成镜像后并 push 到 registers 上,这种构建方式不需要你本地安装 Docker,如果你需要在本地运行镜像,那当然需要 Docker,单纯的构建是不需要 Docker 环境的
本地构建
①、如果你电脑本地刚好安装了 Docker ,有 Docker 环境,那么也可以将项目构建成本地 Docker 的镜像
查看一下本地镜像:

看到只有 MySQL 镜像,然后执行如下命令构建本地镜像:
mvn compile jib:dockerBuild
看到如下构建日志信息表示构建成功:

构建完成后,我们再来看本地镜像:

相关文章:
SpringBoot-Docker容器化部署发布
在生产环境都是怎么部署 Spring Boot? 打成 jar 直接一键运行打成 war 扔到 Tomcat 容器中运行容器化部署 一、准备Docker 在 CentOS7 上安装好 Docker 修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/s…...
重生奇迹mu格斗怎么加点
1.力量加点 力量是格斗家的主要属性之一,它可以增加你的攻击力和物理伤害。因此,对于格斗家来说,力量加点是非常重要的。建议在前期将大部分的加点放在力量上,这样可以让你更快地杀死怪物,提高升级速度。 2.敏捷加点…...
「浙江科聪新品发布」新品发布潜伏顶升式移动机器人专用控制器
聚焦专用车型 最小专用控制器 控制器只占整机5%,纵向出线方式,占比更小 更易插拔 整体解决方案 更具价格优势 提供整体解决方案,配套各类型产品设备及车体厂家 打造持久稳定使用 坚持工业级品质 采用车规级接口,不用其它类不可…...
大数据学习(22)-spark
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
String类常用方法总结
目录 一.简单认识String 二.String对象的比较 1.equals 内部实现原理: 2.compareTo 3.compareToIgnoreCase 三.字符串查找 示例: 四.字符串与其他类型转化 1.数值和字符串相互转换 2.大小写相互转化 3.字符串转数组 4.格式化转化 五.字符串…...
TensorFlow实战教程(二十八)-Keras实现BiLSTM微博情感分类和LDA主题挖掘分析
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章通过Keras深度学习构建CNN模型识别阿拉伯手写文字图像,一篇非常经典的图像分类文字。这篇文章将结合文本挖掘介绍微博情感分类知识,包括数据预处理、机器学习和深度学习的情感分类,后续结…...
个人博客添加访问人数以及访问时间-githubpage
layout: post # 使用的布局(不需要改) title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…...
Django--重定向redirect
在 Django 中,redirect 是一个用于进行重定向的函数。它允许你将用户从一个 URL 重定向到另一个 URL,通常用于处理表单提交、用户登录、用户注册等操作后的页面跳转。redirect 函数属于 django.shortcuts 模块。 以下是 redirect 函数的基本用法和一些参…...
在html和css中的引用svg(一)
问题:如何让 DIV 中的svg垂直居中? HTML 代码: <div class"content"><svg ...> ... </svg></div> CSS代码: .content svg { vertical-align: middle;} 实用扩展:如何让 DIV 中…...
C/C++ 实现:自然排序:针对两个需要排序的字符串,不仅逐个比较每个字符的顺序,对于连在一起的数字字符会作为一个完整数字进行比较 某知名企业的笔试题
目录 题目描述: 分析: 代码实现: 完整代码: 运行结果: 题目描述: 下面是一个自然排序函数的声明,请实现该函数; 自然排序是指:针对两个需要排序的字符串,不仅逐个比较每个...
sse实时通信
使用原因:用户网络环境较差,之前使用ws总是出现断连重连,导致数据总是不能实时更新,所以更换为sse npm install event-source-polyfill createWebSocket:创建sse连接 getWebSocketMsg:接收sse消息 impo…...
Qt专栏3—Qt项目创建Hello World
setp1 打开软件 双击Qt Creator 11.0.3 (Community),打进入软件界面 step2 创建项目 点击创建项目 step3 选择模板 选着Application(Qt)->Qt Widgets Application setp4 设置项目 名称中填入项目号名,创建路径中填入项目保存位…...
linux输出的重定向无效问题和解决
我们在调试程序或者打印日志时经常会遇到重定向的问题,而有时候会遇到重定向无效的问题,下面给一个简单的例子,首先写一个简单的test.c #include <stdio.h>int main(){fprintf(stdout, "hello\n");fprintf(stderr, "world\n");return 0; }编译生…...
chromium114添加新的语言国际化支持
一、需求说明 需要chromium114支持新语言体系,例如藏语,蒙古语,苗语等 二、操作步骤 1. build/config/locales.gni修改 在all_chrome_locales变量中添加新的语种标识,如下图。 2. 添加编译文件,告诉浏览器在编译时需要加载和输出那些文件 尝试编译出现错误一提示。需要…...
赛氪荣幸受邀参与中国联合国采购促进会第五次会员代表大会
11 月21 日 (星期二) 下午14:00,在北京市朝阳区定福庄东街1号中国传媒大学,赛氪荣幸参与中国联合国采购促进会第五次会员代表大会。 2022年以来,联合国采购杯全国大学生英语大赛已经走上了国际舞台,共有来自…...
车载通信架构 —— 传统车内通信网络发展回顾
车载通信架构 —— 传统车内通信网络发展回顾 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何…...
`maven.test.skip` 和 `skipTests` 的区别
maven.test.skip 和 skipTests 的区别 -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。 -Dmaven.test.skiptrue,不执行测试用例,也不编译测试用例类。...
linux输出的重定无效问题和解决
我们在调试程序或者打印日志时经常会遇到重定向的问题,而有时候会遇到重定向无效的问题,下面给一个简单的例子,首先写一个简单的test.c #include <stdio.h>int main(){fprintf(stdout, "hello\n");fprintf(stderr, "world\n");return 0; }编译生…...
开发上门按摩系统对技师如何管理,薪资结构怎么设计
开发完上门按摩系统平台上线之后,对技师的管理和薪资结构是非常重要的环节,关乎着平台的服务能力和服务质量,那么应该如何去管理和设计薪资结构呢 首先说技师管理: 一、培训和认证:平台应对技师进行全面的培训…...
云HIS系统源码,医院管理系信息统源码,融合B/S版四级电子病历系统
医院管理信息系统是以推进公共卫生、医疗、医保、药品、财务监管信息化建设为着力点,整合资源,加强信息标准化和公共服务信息平台建设,逐步实现统一高效、互联互通的管理系统。 SaaS模式Java版云HIS系统,在公立二甲医院应用三年…...
一键部署本地大模型:从自动化脚本到实战部署全解析
1. 项目概述与核心价值最近在折腾本地大语言模型(LLM)的朋友,估计都绕不开一个词:一键部署。从早期的复杂脚本到如今的各种图形化工具,大家追求的目标都很一致——让技术门槛降下来,让更多人能轻松玩起来。…...
Windows 本地部署 OpenClaw!完整安装教程 + 飞书接入,全程避坑——从零开始,手把手教你搭建企业级知识库问答机器人,并无缝集成飞书
引言:为什么选择 OpenClaw? 在当今信息爆炸的时代,企业内部的知识散落在文档、邮件、会议记录等各个角落,员工查找信息效率低下,重复性问题消耗了大量宝贵时间。OpenClaw 正是为解决这一痛点而生的开源项目。 OpenCl…...
Python中PyTorch模型如何显存优化_使用梯度检查点减少显存占用
梯度检查点是通过只保存部分中间激活值、反向时重算前向来节省显存的技术,能降低40%~60%显存但增加15%~30%训练时间,要求模块前向可重入且无副作用。梯度检查点是什么,为什么能省显存梯度检查点(torch.utils.checkpoint.checkpoin…...
7-Zip完整指南:免费高效的终极文件压缩解决方案
7-Zip完整指南:免费高效的终极文件压缩解决方案 【免费下载链接】7z 7-Zip Official Chinese Simplified Repository (Homepage and 7z Extra package) 项目地址: https://gitcode.com/gh_mirrors/7z1/7z 你是否曾经因为文件太大无法通过邮件发送而烦恼&…...
告别电脑!这5款手机自动化脚本App,让你躺着搞定日常重复操作(附详细对比)
告别电脑!这5款手机自动化脚本App,让你躺着搞定日常重复操作 每天早上醒来第一件事就是打开五个App签到领积分?游戏日常任务刷到手指发麻?工作群里的日报周报永远忘记提交?这些重复性操作正在悄悄吞噬你的时间和精力。…...
Win11系统诊断启动后PIN失效?别慌!手把手教你用WinRE命令提示符修复(附System32下cmd丢失的终极解法)
Win11诊断启动后PIN失效的终极修复指南:从WinRE到System32文件丢失的全面解决方案 当你为了解决WiFi问题而尝试"诊断启动"后,突然发现系统提示"你的PIN不可用",甚至无法通过常规方式修复——这种突如其来的系统故障足以让…...
Unity ML-Agents强化学习实战:AutoMind与MLE-Bench优化指南
1. 项目背景与核心价值 这个项目源于我在使用Unity ML-Agents进行强化学习(RL)开发时的实战经验总结。ML-Agents是Unity官方推出的机器学习工具包,允许开发者通过Python接口训练智能体在3D环境中学习复杂行为。但在实际应用中,我发现官方文档对某些关键细…...
OpenAI推出ChatGPT自助广告管理器测试版,广告业务迈入自主投放新阶段
ChatGPT自助广告管理器:开启广告自主投放新时代5月7日消息,据SearchEngineJournal报道,OpenAI正式推出ChatGPT自助广告管理器(Ads Manager)测试版,并面向美国广告主开放。这一举措意味着ChatGPT广告业务告别…...
Unpaywall学术解锁神器:3分钟告别付费文献困扰的终极指南
Unpaywall学术解锁神器:3分钟告别付费文献困扰的终极指南 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpaywall-exten…...
WaveTools终极指南:5分钟掌握鸣潮多账号管理与画质优化
WaveTools终极指南:5分钟掌握鸣潮多账号管理与画质优化 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否为鸣潮多账号管理而烦恼?每次切换账号都要重新登录、调整画质设置&…...
