体验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的容器探针:实战篇》;
辅助部分是一些参考资料和备忘总结,如下:
本篇简介
- 本篇的主题是动手实战,力求最快速度体验官方的镜像制作方案;
- 本篇不会涉及理论知识,这些留给下一章;
- 一通操作后可能会产生诸多疑问,文末留下了几个典型问题,您可以先思考再进入下一章揭晓;
SpringBoot应用源码
本次实战用的是普通的SpringBoot工程,如果您不想写代码,源码可在GitHub下载到,地址和链接信息如下表所示:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本章的应用在dockerlayerdemo文件夹下,如下图红框所示:
版本信息
- SpringBoot:2.3.0.RELEASE
- JDK:1.8.0_121
- Maven:3.3.9
- Docker:19.03.8
- 操作系统:MacBook pro 13寸,macOS Catalina 10.15.4
构建镜像实战
- 修改pom.xml,给spring-boot-maven-plugin插件的配置增加子节点,enabled的值为true,如下图红框所示:
- 在pom.xml文件所在目录新增Dockerfile文件,内容如下:
# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8u212-jdk-stretch as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式构建镜像
FROM openjdk:8u212-jdk-stretch
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
- 执行以下命令编译构建工程:
mvn clean package -U -DskipTests
- 编译构建完成后确保target目录有jar文件生成;
- 在Dockerfile所在目录执行以下命令构建镜像(请按照您的实际情况调整镜像名):
docker build -t dockerlayerdemo:0.0.1 .
- 镜像构建成功的提示如下:
验证
- 执行以下命令创建并启动容器:
docker run --rm -p 8080:8080 dockerlayerdemo:0.0.1
- 启动成功的控制台信息:
3. 浏览器访问:http://localhost:8080/hello ,如下图,一切正常:
4. 看看镜像的分层信息,执行命令:
docker history dockerlayerdemo:0.0.1
- 如下图,整个jar的内容,例如class、依赖库、依赖资源等,分多次COPY到镜像空间中,所以今后如果只改了class,在更新镜像的时候,只需要下载class的layer即可(其他layer可以直接用之前缓存到本地的):
留下的问题
至此,SpringBoot-2.3.0.RELEASE官方推荐的镜像构建方式就实践完成了,但是也留下了一些疑问:
- 2.3版本推荐的镜像构建方案,和旧版本比有什么不同?
- pom.xml中spring-boot-maven-plugin插件新增的参数,到底做了什么?
- Dockerfile中,java -Djarmode=layertools -jar application.jar extract这个操作啥意思?
这些问题留待下一篇文章一起深入研究。
参考信息
官方文档地址:
https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/pdf/spring-boot-reference.pdf ,4.31章节
欢迎访问我的GitHub
- 地址:https://github.com/zq2599/blog_demos
- 内容:原创文章分类汇总,及配套源码,涉及Java、Docker、K8S、DevOPS等
欢迎关注我的公众号:程序员欣宸
本文由博客一文多发平台 OpenWrite 发布!
体验SpringBoot(2.3)应用制作Docker镜像(官方方案)的更多相关文章
- 详解SpringBoot(2.3)应用制作Docker镜像(官方方案)
关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...
- SpringBoot系列: 制作Docker镜像的全过程
本文主要参考了 https://segmentfault.com/a/1190000016449865 , 感谢作者的付出. 另外, 在本文中, 演示了Windows+Maven+Docker To ...
- 制作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. 上一篇:Dockerf ...
- Dockerfile 自动制作 Docker 镜像(一)—— 基本命令
Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...
- 手动制作Docker镜像
手动制作 Docker 镜像 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器(用来用去感觉 Windows 的 Docker 出各种问题,比如使用 ...
- 【玩转开源】制作Docker镜像
做嵌入式方向经常会遇到的一个问题,就是编译环境安装,如果换电脑,再重新安装环境是一个比较费时的事情,这个时候可以自己制作一个Docker镜像,然后把编译环境在Docker镜像里面配置好,以后同步环境就 ...
随机推荐
- 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
小程序·云开发的云调用能力,让用户可以免鉴权快速调用微信的开放能力,极大节约了开发成本.现在,大家期待已久的云开发 CMS 内容管理系统,终于上线啦!顺便提示,接下来还可以二次开发哦! 云开发 CMS ...
- kibana 通过nginx+ldap实现登录认证
nginx配置 使用自己搭建的openldap 使用用户中心的openldap
- MySQL++:Liunx - MySQL 主从复制
目标:搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制 环境:虚拟机 主数据库:192.168.211.101 从数据库:192.168.211.102 MySQL 安装可参 ...
- Oracle细粒度审计
场景 管理信息化应用,想审计某张表的数据是否做了删除.Oracle中专门有自带的函数.可以满足这个需求 1.查询审计日志的语句 select timestamp, db_user, os_user, ...
- 数据结构----双端队列Dque
双端队列的概念与数据结构 deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. deque 特殊之处在于添加和删除项是非限制性的.可以在前面或后面 ...
- Java基础知识面试题及答案-整理
1.String类可以被继承吗? 不能.String类在声明中使用final关键字修饰符.使用final关键字修饰的类无法被继承. Java语言的开发者为什么要将String类定义为final类呢? ...
- block和delegate的选择
block和delegate均为常用回调方式 (暂不讨论通知) 代理 优点: 设置某个对象的代理,代理对象可以与被代理对象不直接相关,即使两个对象距离较远,传值也比较方便. 代理方法内可以方便调用 ...
- 实用算法系列之RT-Thread链表堆管理器
[导读] 前文描述了栈的基本概念,本文来聊聊堆是怎么会事儿.RT-Thread 在社区广受欢迎,阅读了其内核代码,实现了堆的管理,代码设计很清晰,可读性很好.故一方面了解RT-Thread内核实现,一 ...
- C#中的out关键字
在一个方法里面使用out关键字的时候这个方法中作为out关键字之后的参数会被返回出去:调用这个方法的时候需要先有一个变量来承接这个传递出来.已经被该方法改动过的参数,并且要记得传实参的时候前面带上ou ...
- 第4章 最基础的分类算法-k近邻算法
思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...