体验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章节

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

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

相关文章
|
19天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
3天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
19 3
docker push推送自己搭建的镜像
|
19天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
41 9
|
19天前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
42 4
|
24天前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
41 3
|
28天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
Java Docker Spring
spring 代码中,解决docker环境变量传递问题
1,docker变量 在docker中定义变量,使用echo $Value 能直接在命令行中显示, 这个使用spring可以直接注入到代码当中。 php中有方便的代码直接获得环境变量,但是java用起来就麻烦点。 直接使用spring的value就行了。 2,代码 比如一个spring的用户登录action。 里面用docker配置了一个默认的admin登录
1794 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
|
3天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
35 14