体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

简介: 2.3版本的SpringBoot,推荐了新的docker镜像构建方案,一起来实践吧

欢迎访问我的GitHub

关于《SpringBoot-2.3容器化技术》系列

  • 《SpringBoot-2.3容器化技术》系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更加适应容器化环境,在云计算时代依旧紧跟主流,保持竞争力;
  • 全系列文章分为主题和辅助两部分,主题部分如下:
  1. 《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》
  2. 《详解SpringBoot(2.3)应用制作Docker镜像(官方方案)》
  3. 《掌握SpringBoot-2.3的容器探针:基础篇》
  4. 《掌握SpringBoot-2.3的容器探针:深入篇》
  5. 《掌握SpringBoot-2.3的容器探针:实战篇》
  • 辅助部分是一些参考资料和备忘总结,如下:
  1. 《SpringBoot-2.3镜像方案为什么要做多个layer》
  2. 《设置非root账号不用sudo直接执行docker命令》
  3. 《开发阶段,将SpringBoot应用快速部署到K8S》

    本篇简介

  4. 本篇的主题是动手实战,力求最快速度体验官方的镜像制作方案;
  5. 本篇不会涉及理论知识,这些留给下一章;
  6. 一通操作后可能会产生诸多疑问,文末留下了几个典型问题,您可以先思考再进入下一章揭晓;

    SpringBoot应用源码

  7. 本次实战用的是普通的SpringBoot工程,如果您不想写代码,源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
名称 链接 备注
项目主页 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协议
  1. 这个git项目中有多个文件夹,本章的应用在dockerlayerdemo文件夹下,如下图红框所示:
    在这里插入图片描述

    版本信息

  2. SpringBoot:2.3.0.RELEASE
  3. JDK:1.8.0_121
  4. Maven:3.3.9
  5. Docker:19.03.8
  6. 操作系统:MacBook pro 13寸,macOS Catalina 10.15.4

    构建镜像实战

  7. 修改pom.xml,给spring-boot-maven-plugin插件的配置增加子节点,enabled的值为true,如下图红框所示:
    在这里插入图片描述
  8. 在pom.xml文件所在目录新增Dockerfile文件,内容如下:
    ```shell

    指定基础镜像,这是分阶段构建的前期阶段

    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"]

3. 执行以下命令编译构建工程:
```shell
mvn clean package -U -DskipTests
  1. 编译构建完成后确保target目录有jar文件生成;
  2. 在Dockerfile所在目录执行以下命令构建镜像(请按照您的实际情况调整镜像名):
    docker build -t dockerlayerdemo:0.0.1 .
    
  3. 镜像构建成功的提示如下:
    在这里插入图片描述

    验证

  4. 执行以下命令创建并启动容器:

    docker run --rm -p 8080:8080 dockerlayerdemo:0.0.1
    
  5. 启动成功的控制台信息:
    在这里插入图片描述

  6. 浏览器访问:http://localhost:8080/hello ,如下图,一切正常:
    在这里插入图片描述
  7. 看看镜像的分层信息,执行命令:

    docker history dockerlayerdemo:0.0.1
    
  8. 如下图,整个jar的内容,例如class、依赖库、依赖资源等,分多次COPY到镜像空间中,所以今后如果只改了class,在更新镜像的时候,只需要下载class的layer即可(其他layer可以直接用之前缓存到本地的):
    在这里插入图片描述

    留下的问题

    至此,SpringBoot-2.3.0.RELEASE官方推荐的镜像构建方式就实践完成了,但是也留下了一些疑问:

  9. 2.3版本推荐的镜像构建方案,和旧版本比有什么不同?
  10. pom.xml中spring-boot-maven-plugin插件新增的参数,到底做了什么?
  11. 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章节

欢迎关注阿里云开发者社区:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

相关文章
|
5月前
|
Docker 容器 Perl
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
1181 32
|
3月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
202 63
|
4月前
|
缓存 Shell 网络安全
将应用程序打包成Docker镜像时可能遇到哪些问题?
将应用程序打包成Docker镜像时可能遇到哪些问题?
450 77
|
4月前
|
Shell 应用服务中间件 nginx
docker 镜像的部分常用命令
docker镜像常用命令
162 16
|
4月前
|
关系型数据库 MySQL Docker
|
Java Maven Docker
SpringBoot Docker远程发布
SpringBoot Docker远程发布 docker远程发布有2种方法一种是直接利用mevan的docker插件配置发布参数,另一种是使用Dockerfile文件发布 方式一:插件配置发布 maven配置 com.
1318 0
|
10天前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
91 4
基于springboot+vue开发的会议预约管理系统
|
4月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
444 1