详解SpringBoot(2.3)应用制作Docker镜像(官方方案)
关于《SpringBoot-2.3容器化技术》系列
《SpringBoot-2.3容器化技术》系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更加适应容器化环境,在云计算时代依旧紧跟主流,保持竞争力;
全系列文章分为主题和辅助两部分,主题部分如下:
- 《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》;
- 《详解SpringBoot(2.3)应用制作Docker镜像(官方方案)》;
- 《掌握SpringBoot-2.3的容器探针:基础篇》;
- 《掌握SpringBoot-2.3的容器探针:深入篇》;
- 《掌握SpringBoot-2.3的容器探针:实战篇》;
辅助部分是一些参考资料和备忘总结,如下:
本篇简介
在前文,咱们快速体验了官方推荐的docker镜像制作方案,但也产生了几个疑问:
- SpringBoot-2.3版本推荐的镜像构建方案和旧版本比有什么不同?
- pom.xml中spring-boot-maven-plugin插件新增的参数,到底做了什么?
- Dockerfile中,java -Djarmode=layertools -jar application.jar extract这个操作啥意思?
本篇的目标就是解答上述问题,在寻找答案的过程中不断补全知识点,提升自己;
关键知识点:镜像layer
前文多次提到的镜像layer到底是什么,为什么会有多层layer?有必要先把这个知识点夯实了,请参考文章《SpringBoot-2.3镜像方案为什么要做多个layer》
老版本SpringBoot的官方方案
以SpringBoot-2.2.0.RELEASE版本为例,官方文档(
https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/pdf/spring-boot-reference.pdf)给出的做法如下:
- 将SpringBoot工程编译构建,在target目录得到jar;
- 在target目录新建dependency文件夹;
- 将jar解压到dependency文件夹;
- 编写Dockerfile文件,内容如下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"]
- 可见,官方推荐的做法是将整个jar文件解压,在Dockerfile中多次用COPY命令分别复制,这样做的好处显而易见:多个layer,如果镜像的新版本中只修改了应用代码,那么下载镜像时只会下载/app这个layer,其他部分直接使用本地缓存,这是docker镜像的常规优化手段;
- 上述方案有个小问题:麻烦!!!
- 于是2.3.0.RELEASE版本做了些优化,让事情变得简单些;
2.3.0.RELEASE版本方案和旧版的区别
2.3.0.RELEASE版本构建Docker的步骤如下:
- pom.xml中的spring-boot-maven-plugin插件增加一个配置项;
2.编译构建生成jar; - 编写Dockerfile,里面用到了多阶段构建(multi-stage builds),用工具从jar中提取拆分后,再多次执行COPY命令将拆分后的内容放入镜像,达到多个layer的目的;
因此,2.3.0.RELEASE版本和旧版本相比有如下变化:
- pom.xml中多了个参数;
- 构建好jar后,无需自己解压jar;
- Dockefile内容不一样,旧版是手动解压jar,再在Dockerfile分别复制,2.3.0.RELEASE是通过java命令从jar中提取出各部分内容;
搞清楚了新旧版本的区别,咱们继续研究下一个问题吧;
pom.xml中spring-boot-maven-plugin插件新增的参数
- pring-boot-maven-plugin插件新增参数如下图所示:

2. 上述参数有啥用?我这边编译构建了两次jar,第一次有上述参数,第二次没有,将两次生成的jar解压后对比,发现用了上述参数后,生成的jar会多出下图红框中的两个文件:

- 看看layers.idx文件的内容,如下图:

- 上图中的内容分别是什么意思呢?官方已给出了详细解释,如下图红框:

- 综上所述,layers.idx文件是个清单,里面记录了所有要被复制到镜像中的信息,接下来看看如何使用layers.idx文件,这就涉及到jar包中新增的另一个文件:spring-boot-jarmode-layertools-2.3.0.RELEASE.jar
spring-boot-jarmode-layertools工具
- 前面已经介绍过jar中除了layers.idx,还多了个文件:spring-boot-jarmode-layertools-2.3.0.RELEASE.jar ,来看看这个文件的用处;
- 进入工程的target目录,这里面是编译后的jar文件(我这里文件名为dockerlayerdemo-0.0.1-SNAPSHOT.jar),注意此时的spring-boot-maven-plugin插件是带上了下图红框中的参数的:

- 执行以下命令:
java -Djarmode=layertools -jar dockerlayerdemo-0.0.1-SNAPSHOT.jar list
- 得到结果如下图所示,是layers.idx文件的内容:

- 来看看官方对这个layertools的解释,list参数的作用上面我们已经体验过了,重点是红框中的extract参数,它的作用是从jar中提取构建镜像所需的内容:

- 看到这里,您是否想到了《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》中Dockerfile的内容,请看下图的红框和红字,是否有种恍然大悟的感觉:jar构建生成清单layers.idx,Dockerfile中根据清单从jar提取文件放入镜像:

至此,三个问题都已经找到了答案,小结一下:
SpringBoot-2.3.0.RELEASE推荐的镜像构建方案和旧版本相比有什么不同
- pom.xml中的spring-boot-maven-plugin插件增加一个配置项;
- 构建好jar后,旧版本要自己解压jar,新版不需要;
- 新版本的jar中,多了个文件清单layers.idx和镜像文件处理工具spring-boot-jarmode-layertools-2.3.0.RELEASE.jar;
- 旧版的Dockefile内容:因为前面解压好了,所有在Dockerfile里直接复制前面解压的内容,这里就有个风险:前一步解压和当前复制的文件位置要保证一致;
- 新版的Dockerfile内容:使用工具spring-boot-jarmode-layertools-2.3.0.RELEASE.jar,根据的layers.idx内容从jar中提取文件,复制到镜像中;
- 新版的Dockerfile中,由于使用了分阶段构建,因此从jar提取文件的操作不会保存到镜像的layer中;
pom.xml中spring-boot-maven-plugin插件新增的参数,到底做了什么
spring-boot-maven-plugin插件新增的参数,使得编译构建得到jar中多了两个文件,如下图所示:

Dockerfile中,java -Djarmode=layertools -jar application.jar extract这个操作啥意思
- java -Djarmode=layertools -jar application.jar extract的作用是从jar中提取文件,这些文件是docker镜像的一部分;
- 上述操作的参数是extract,另外还有两个参数,官方解释它们的作用如下:

至此,问题已全部澄清,相信您对SpringBoot-2.3.0.RELEASE官方的镜像构建方案也足够了解了,最后是我根据自己的认识画的流程图,帮助您快速理解整个构建流程:

欢迎访问我的GitHub
- 地址:https://github.com/zq2599/blog_demos
- 内容:原创文章分类汇总,及配套源码,涉及Java、Docker、K8S、DevOPS等
欢迎关注我的公众号:程序员欣宸

https://github.com/zq2599/blog_demos
详解SpringBoot(2.3)应用制作Docker镜像(官方方案)的更多相关文章
- 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)
关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...
- Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- SpringBoot系列: 制作Docker镜像的全过程
本文主要参考了 https://segmentfault.com/a/1190000016449865 , 感谢作者的付出. 另外, 在本文中, 演示了Windows+Maven+Docker To ...
- 详解Springboot中自定义SpringMVC配置
详解Springboot中自定义SpringMVC配置 WebMvcConfigurer接口 这个接口可以自定义拦截器,例如跨域设置.类型转化器等等.可以说此接口为开发者提前想到了很多拦截层面的需 ...
- Dockerfile自动制作Docker镜像(二)—— 其它常用命令
Dockerfile自动制作Docker镜像(二)-- 其它常用命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Dockerf ...
- 制作Docker镜像的两种方式
此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...
- [开源]制作docker镜像不依赖linux和Docker环境
背景 最近群友们经常反馈docker镜像制作起来有点麻烦,我开源的antdeploy工具虽然可以制作镜像但是必须有一个提前:有一台安装好docker的linux服务器.因为大家开发环境基本上都是win ...
- Dockerfile 自动制作 Docker 镜像(三)—— 镜像的分层与 Dockerfile 的优化
Dockerfile 自动制作 Docker 镜像(三)-- 镜像的分层与 Dockerfile 的优化 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云 ...
- Dockerfile 自动制作 Docker 镜像(一)—— 基本命令
Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...
随机推荐
- Python-控制台实现简单的名片管理系统
通过Python开发一个基于控制台的名片管理系统,具体看下图以及相关代码. cards_main.py文件中提供程序的入口 import cards_toolslx while True: # TOD ...
- 很好的awk教程
讲的内容配合分析web log ,疗效很好! http://www.ibm.com/developerworks/cn/linux/l-cn-awk-httplog/ 出差归来,哈哈,吐槽的不必写了, ...
- Djano之ORM多表查询操作
# 把 model 转化为 迭代器去循环 MODEL.objects.all().iterator() # 等同于 values, values_list, 但是 only 这种方式 获取字段属性依旧 ...
- poj3308 最小点权覆盖
Paratroopers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8837 Accepted: 2663 Desc ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
- 网鼎杯玄武组部分web题解
查看JS,在JS中找到p14.php,直接copy下来console执行,输入战队的token就可以了 js_on 顺手输入一个 admin admin,看到下面的信息 欢迎admin这里是你的信息: ...
- JNPF低代码开发框架代码生成器设计
1.代码生成器目录下有通用开发模板.单表开发模板.多表开发模板.流程表单模板.移动开发模板等: ①代码生成器录下通用开发模板页面,有搜索.上步.下步.下载代码功能操作: ②输入查询条件表名关键字进行搜 ...
- Java-KTVByLinkedList模拟点歌工具
import java.util.LinkedList; import java.util.Scanner; public class KTVByLinkedList { public static ...
- 发光加载环动画-纯CSS动画效果-如何创建CSS3旋转预加载器(参照https://www.bilibili.com/video/BV1V4411C7z5?from=search&seid=9741275927942612817)
//css部分 body{ margin:; padding:; background: #262626; } .ring{ position: absolute; top:50%; left: 50 ...
- Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream
Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream 一.介绍 ByteArrayInputStream 和 ByteArrayOutputSt ...