千家信息网

如何为Spring Boot应用程序创建Docker镜像

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何为Spring Boot应用程序创建Docker镜像",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何为Spring Boot应用程
千家信息网最后更新 2026年11月02日如何为Spring Boot应用程序创建Docker镜像

本篇内容主要讲解"如何为Spring Boot应用程序创建Docker镜像",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何为Spring Boot应用程序创建Docker镜像"吧!

1. 传统Docker构建

使用Spring Boot 构建 Docker 镜像的传统方法是使用 Dockerfile 。下面是一个简单的例子:

FROM openjdk:8-jdk-alpine EXPOSE 8080 ARG JAR_FILE=target/demo-app-1.0.0.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]

然后我们可以使用 docker build 命令来创建 Docker 映像。这对大多数应用程序都很好,但也有一些缺点。

首先,我们使用的是 Spring Boot 创建的 fat jar。这会影响启动时间,尤其是在集装箱环境中。我们可以通过添加jar文件的分解内容来节省启动时间。

其次,Docker镜像是分层构建的。Spring Boot fat jar 的特性使得所有的应用程序代码和第三方库都放在一个层中。这意味着即使只有一行代码更改,也必须重新构建整个层。

通过在构建之前分解 jar ,应用程序代码和第三方库各自获得自己的层。这样,我们便可以利用Docker的缓存机制。现在,当某一行代码被更改时,只需要重新构建相应的层。

考虑到这一点,让我们看看Spring Boot 如何改进创建Docker镜像的过程。

2. Buildpacks

BuildPacks 是一种提供框架和应用程序依赖性的工具。

例如,给定一个Spring Boot fat jar,一个buildpack将为我们提供Java运行时。这使我们可以跳过 Dockerfile 并自动获得一个合理的docker 镜像。

Spring Boot 包括对 bulidpacks 的Maven和Gradle支持。例如,使用Maven构建时,我们将运行以下命令:

./mvnw spring-boot:build-image

我们观察下一些相关的输出,看看发生了什么:

[INFO] Building jar: target/demo-0.0.1-SNAPSHOT.jar ... [INFO] Building image 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 100% ... [INFO]     [creator]     ===> DETECTING [INFO]     [creator]     5 of 15 buildpacks participating [INFO]     [creator]     paketo-buildpacks/bellsoft-liberica 2.8.1 [INFO]     [creator]     paketo-buildpacks/executable-jar    1.2.8 [INFO]     [creator]     paketo-buildpacks/apache-tomcat     1.3.1 [INFO]     [creator]     paketo-buildpacks/dist-zip          1.3.6 [INFO]     [creator]     paketo-buildpacks/spring-boot       1.9.1 ... [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] Total time:  44.796 s

第一行显示我们构建了标准的 fat jar,与其他典型的maven包一样。

下一行开始Docker映像构建。然后,看到这个 bulid 拉取了 packeto 构建器。

packeto 是基于云原生 bulidpacks 的实现。它负责分析我们的项目并确定所需的框架和库。在我们的例子中,它确定我们有一个Spring Boot项目并添加所需的构建包。

最后,我们看到生成的Docker映像和总构建时间。注意,在第一次构建时,花了相当多的时间下载构建包并创建不同的层。

buildpacks 的一大特点是Docker映像是多层的。因此,如果我们只更改应用程序代码,后续构建将更快:

... [INFO]     [creator]     Reusing layer 'paketo-buildpacks/executable-jar:class-path' [INFO]     [creator]     Reusing layer 'paketo-buildpacks/spring-boot:web-application-type' ... [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO] Total time:  10.591 s

3. 层级jar包

在某些情况下,我们可能不喜欢使用 bulidpacks ——也许我们的基础架构已经绑定到另一个工具上,或者我们已经有了我们想要重新使用的自定义 Dockerfiles 。

基于这些原因,Spring Boot 还支持使用分层jars 构建Docker映像。为了了解它的工作原理,让我们看看一个典型的Spring Boot fat jar 布局:

org/   springframework/     boot/   loader/ ... BOOT-INF/   classes/ ... lib/ ...

fat jar 由3个主要区域组成:

  • 启动Spring应用程序所需的引导类

  • 应用程序代码

  • 第三方库

使用分层jar,结构看起来很相似,但是我们得到了一个新的 layers.idx 将 fat jar 中的每个目录映射到一个层的文件:

- "dependencies":   - "BOOT-INF/lib/" - "spring-boot-loader":   - "org/" - "snapshot-dependencies": - "application":   - "BOOT-INF/classes/"   - "BOOT-INF/classpath.idx"   - "BOOT-INF/layers.idx"   - "META-INF/"

Out-of-the-box, Spring Boot provides four layers:

开箱即用,Spring Boot 提供4层:

  • dependencies: 来自第三方的依赖

  • snapshot-dependencies: 来自第三方的 snapshot 依赖

  • resources: 静态资源

  • application: 应用程序代码和资源(resources)

我们的目标是将应用程序代码和第三方库放置到层中,以反映它们更改的频率。

例如,应用程序代码可能是更改最频繁的代码,因此它有自己的层。此外,每一层都可以独立演化,只有当一层发生变化时,才会为它重建 Docker 镜像。

现在我们了解了分层 jar 结构,接下来看看如何利用它来制作 Docker 映像。

3.1.创建分层 jar

首先,我们必须建立一个项目来创建一个分层的jar。对于Maven,则需要在POM的 Spring Boot plugin 部分添加一个新的配置:

     org.springframework.boot     spring-boot-maven-plugin                           true               

有了这个配置,Maven package 命令(包括它的其他依赖命令)将使用前面提到的四个默认层生成一个新的分层jar。

3.2. 查看和提取分层

下一步,我们需要从 jar 中提取层,这样Docker镜像才能拥有正确的层。要检查分层jar的任何层,可以运行以下命令:

java -Djarmode=layertools -jar demo-0.0.1.jar list

然后提取它们,运行命令:

java -Djarmode=layertools -jar demo-0.0.1.jar extract

3.3. 创建Docker映像

将这些层合并到 Docker 映像中的最简单方法是使用 Dockerfile :

FROM adoptopenjdk:11-jre-hotspot as builder ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract   FROM adoptopenjdk:11-jre-hotspot COPY --from=builder dependencies/ ./ COPY --from=builder snapshot-dependencies/ ./ COPY --from=builder spring-boot-loader/ ./ COPY --from=builder application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

这个 Dockerfile 从fat jar中提取层,然后将每个层复制到Docker映像中。

每个COPY指令最终都会在Docker映像中生成一个新层。

如果我们构建这个Dockerfile,我们可以看到分层jar中的每个层都作为自己的层添加到Docker镜像中:

... Step 6/10 : COPY --from=builder dependencies/ ./  ---> 2c631b8f9993 Step 7/10 : COPY --from=builder snapshot-dependencies/ ./  ---> 26e8ceb86b7d Step 8/10 : COPY --from=builder spring-boot-loader/ ./  ---> 6dd9eaddad7f Step 9/10 : COPY --from=builder application/ ./  ---> dc80cc00a655 ...

到此,相信大家对"如何为Spring Boot应用程序创建Docker镜像"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

应用程序 程序 应用 代码 映像 镜像 命令 第三方 一行 时间 运行 内容 方法 项目 传统 例子 典型 只有 工具 文件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 上海睿民互联网科技有限公司 互联网佳科技有限公司 深圳恒合互联网络科技有限公司 互联网和科技创新 互联网科技开发公司 深圳齐家互联网科技 互联网 视角下的科技创新 佩信高科技互联网 老年人脱离互联网科技的作文 上海电发互联网科技有限公司 小米互联网科技园设置 浙江互联网科技研学营 深圳育鹏互联网科技有限公司招聘 互联网科技研发水平 天津腾达互联网科技有限公司 明优互联网科技有限公司 互联网科技圈年度人物 易企秀互联网科技是做什么的 安徽九吞吴互联网科技有限公司 互联网通讯科技 天津摩尔互联网科技 科技赋能互联网健康 银川新华互联网科技职业技术培训学校图片 互联网软件和科技 工业互联网展湾科技股份有限公司 互联网科技资金流入 有人说阿里系是互联网科技企业 科技互联网公司两年变化 互联网科技自媒体灵感
0