关于《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-2.3 镜像方案为什么要做多个 layer》;
- 《设置非 root 账号不用 sudo 直接执行 docker 命令》;
- 《开发阶段,将 SpringBoot 应用快速部署到 K8S》;
本篇简介
- 本篇的主题是动手实战,力求最快速度体验官方的镜像制作方案;
- 本篇不会涉及理论知识,这些留给下一章;
- 一通操作后可能会产生诸多疑问,文末留下了几个典型问题,您可以先思考再进入下一章揭晓;
SpringBoot 应用源码
本次实战用的是普通的 SpringBoot 工程,如果您不想写代码,源码可在 GitHub 下载到,地址和链接信息如下表所示:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blo… | 该项目在 GitHub 上的主页 |
git 仓库地址 (https) | https://github.com/zq2599/blo… | 该项目源码的仓库地址,https 协议 |
git 仓库地址 (ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh 协议 |
这个 git 项目中有多个文件夹,本章的应用在 <font color=”blue”>dockerlayerdemo</font> 文件夹下,如下图红框所示:
版本信息
- 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,给 <font color=”blue”>spring-boot-maven-plugin</font> 插件的配置增加子节点,<font color=”blue”>enabled</font> 的值为 <font color=”red”>true</font>,如下图红框所示:
- 在 pom.xml 文件所在目录新增 <font color=”blue”>Dockerfile</font> 文件,内容如下:
# 指定基础镜像,这是分阶段构建的前期阶段
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 目录有 <font color=”red”>jar</font> 文件生成;
- 在 Dockerfile 所在目录执行以下命令构建镜像 (请按照您的实际情况调整镜像名):
docker build -t dockerlayerdemo:0.0.1 .
- 镜像构建成功的提示如下:
验证
- 执行以下命令创建并启动容器:
docker run --rm -p 8080:8080 dockerlayerdemo:0.0.1
- 启动成功的控制台信息:
- 浏览器访问:http://localhost:8080/hello,如下图,一切正常:
- 看看镜像的分层信息,执行命令:
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 中,<font color=”blue”>java -Djarmode=layertools -jar application.jar extract</font> 这个操作啥意思?
这些问题留待下一篇文章一起深入研究。
参考信息
官方文档地址:
https://docs.spring.io/spring…,4.31 章节
欢迎访问我的 GitHub
- 地址:https://github.com/zq2599/blog_demos
- 内容:原创文章分类汇总,及配套源码,涉及 Java、Docker、K8S、DevOPS 等
欢迎关注我的公众号:程序员欣宸
本文由博客一文多发平台 OpenWrite 发布!