我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Spring Boot创建docker image

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Spring Boot创建docker image

这篇文章主要介绍“如何使用Spring Boot创建docker image”,在日常操作中,相信很多人在如何使用Spring Boot创建docker image问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Spring Boot创建docker image”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

 简介
在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个docker file,将这个fat jar制作成为一个docker image然后运行。

今天我们来体验一下Spring Boot 2.3.3 带来的快速创建docker image的功能。

传统做法和它的缺点
现在我们创建一个非常简单的Spring Boot程序:

@SpringBootApplication @RestController public class Application {      public static void main(String[] args) {         SpringApplication.run(Application.class, args);     }      @GetMapping("/getInfo")     public String getInfo() {         return "www.flydean.com";     } } 复制代码

默认情况下,我们build出来的是一个fat jar:springboot-with-docker-0.0.1-SNAPSHOT.jar

我们解压看一下它的内容:

如何使用Spring Boot创建docker image

Spring boot的fat jar分为三个部分,第一部分就是BOOT-INF, 里面的class目录放的是我们自己编写的class文件。而lib目录存放的是项目依赖的其他jar包。

第二部分是META-INF,里面定义了jar包的属性信息。

第三部分是Spring Boot的类加载器,fat jar包的启动是通过Spring Boot的jarLauncher来创建LaunchedURLClassLoader,通过它来加载lib下面的jar包,最后以一个新线程启动应用的Main函数。

这里不多讲Spring Boot的启动。

我们看一下,如果想要用这个fat jar来创建docker image应该怎么写:

FROM openjdk:8-jdk-alpine EXPOSE 8080 ARG JAR_FILE=target/springboot-with-docker-0.0.1-SNAPSHOT.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] 复制代码

这样写有两个问题。

第一个问题:我们是用的far jar,在使用far jar的过程中会有一定的性能问题,肯定要比解压过后的性能要低,尤其是在容器环境中运行的情况下,可能会更加突出。

第二个问题:我们知道docker的image是按layer来构建的,按layer构建的好处就是可以减少image构建的时间和重用之前的layer。

但是如果使用的是fat jar包,即使我们只修改了我们自己的代码,也会导致整个fat jar重新更新,从而影响docker image的构建速度。

使用Buildpacks
传统的办法除了有上面的两个问题,还有一个就是需要自己构建docker file,有没有一键构建docker image的方法呢?

答案是肯定的。

Spring Boot在2.3.0之后,引入了Cloud Native 的buildpacks,通过这个工具,我们可以非常非常方便的创建docker image。

在Maven和Gradle中,Spring Boot引入了新的phase: spring-boot:build-image

我们可以直接运行:

mvn  spring-boot:build-image 制代码

运行之,很不幸的是,你可能会遇到下面的错误:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) on project springboot-with-docker: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image failed: Docker API call to 'localhost/v1.24/images/create?fromImage=gcr.io%2Fpaketo-buildpacks%2Fbuilder%3Abase-platform-api-0.3' failed with status code 500 "Internal Server Error" and message "Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)" -> [Help 1] 复制代码

这是因为我们无法从gcr.io中拉取镜像!

没关系,如果你会正确的上网方式的话,那么我估计你已经找到了一个代理。

将你的代理配置到Docker的代理项里面,我使用的是Docker desktop,下面是我的配置:

如何使用Spring Boot创建docker image

重新运行 mvn spring-boot:build-image

等待执行结果:

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ springboot-with-docker --- [INFO] Building image 'docker.io/library/springboot-with-docker:0.0.1-SNAPSHOT' [INFO]  [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% [INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 0% 复制代码

你可以看到,我们的确是需要从gcr.io拉取image。

Layered Jars
如果你不想使用Cloud Native Buildpacks,还是想使用传统的Dockerfile。 没关系,SpringBoot为我们提供了独特的分层jar包系统。

怎么开启呢? 我们需要在POM文件中加上下面的配置:

<build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <layers>                        <enabled>true</enabled>                    </layers>                </configuration>            </plugin>        </plugins>    </build> 制代码

再次打包,看下jar包的内容:

如何使用Spring Boot创建docker image

看起来和之前的jar包没什么不同,只不过多了一个layers.idx 这个index文件:

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

index文件主要分为4个部分:

  • dependencies - 非SNAPSHOT的依赖jar包

  • snapshot-dependencies - SNAPSHOT的依赖jar包

  • spring-boot-loader - Spring boot的class loader文件

  • application - 应用程序的class和resources文件

注意,这里的index文件是有顺序的,它和我们将要添加到docker image中的layer顺序是一致的。

最少变化的将会最先添加到layer中,变动最大的放在最后面的layer。

我们可以使用layertools jarmode来对生成的fat jar进行校验或者解压缩:

java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar  Usage:   java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar  Available commands:   list     List layers from the jar that can be extracted   extract  Extracts layers from the jar for image creation   help     Help about any command 复制代码

使用list命令,我们可列出jar包中的layer信息。使用extract我们可以解压出不同的layer。

我们执行下extract命令,看下结果:

如何使用Spring Boot创建docker image

可以看到,我们根据layers.idx解压出了不同的文件夹。

我们看一下使用layer的dockerFile应该怎么写:

FROM adoptopenjdk:11-jre-hotspot as builder WORKDIR application ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract  FROM adoptopenjdk:11-jre-hotspot WORKDIR application 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"] 复制代码

这样我们的一个分层的DockerImage就创建完成了。

自定义Layer
如果我们需要自定义Layer该怎么做呢?

我们可以创建一个独立的layers.xml文件:

<layers xmlns="http://www.springframework.org/schema/boot/layers"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://www.springframework.org/schema/boot/layers               https://www.springframework.org/schema/boot/layers/layers-2.3.xsd">     <application>         <into layer="spring-boot-loader">             <include>org/springframework/boot/loader/**</include>         </into>         <into layer="application" />     </application>     <dependencies>         <into layer="snapshot-dependencies">             <include>*:*:*SNAPSHOT</include>         </into>         <into layer="company-dependencies">             <include>com.flydean:*</include>         </into>         <into layer="dependencies"/>     </dependencies>     <layerOrder>         <layer>dependencies</layer>         <layer>spring-boot-loader</layer>         <layer>snapshot-dependencies</layer>         <layer>company-dependencies</layer>         <layer>application</layer>     </layerOrder> </layers> 复制代码

怎么使用这个layer.xml呢?

添加到build plugin中就可以了:

<build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <layers>                        <enabled>true</enabled>                        <configuration>${project.basedir}/class="lazy" data-src/main/resources/layers.xml</configuration>                    </layers>                </configuration>            </plugin>        </plugins>    </build>

到此,关于“如何使用Spring Boot创建docker image”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Spring Boot创建docker image

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用IDEA2022.1 创建Spring Boot项目

这篇文章主要介绍了如何使用IDEA2022.1 创建Spring Boot项目,大家在使用idea开发工具时发现给以往的版本略微的不同,细心的小编在此记录下,需要的朋友可以参考下
2022-11-13

Spring Boot如何创建和运行

这篇文章主要讲解了“Spring Boot如何创建和运行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot如何创建和运行”吧!1. 初始 Spring Boot1.1 什么
2023-07-02

如何使用Docker部署Spring Boot项目

这篇文章主要介绍如何使用Docker部署Spring Boot项目,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建一个简单的springboot项目一、在 pom.xml 中 ,使用 Spring Boot 2.2
2023-06-22

如何使用Docker部署Spring Boot开源

这篇文章给大家介绍如何使用Docker部署Spring Boot开源,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的
2023-06-19

如何使用Spring Boot内嵌容器Undertow创建服务器

这篇文章给大家分享的是有关如何使用Spring Boot内嵌容器Undertow创建服务器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Undertow是一个Web服务器,那么它就需要具备的现代Web服务器的基本
2023-05-30

怎么使用 Gradle构建Spring-Boot的Docker镜像

这期内容当中小编将会给大家带来有关怎么使用 Gradle构建Spring-Boot的Docker镜像,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通常我们使用 Dockerfile 来构建项目的Docke
2023-06-19

Spring Boot如何动态创建Bean示例代码

前言本文主要给大家介绍了关于Spring Boot动态创建Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。SpringBoot测试版本:1.3.4.RELEASE参考代码如下:package com.sp
2023-05-31

如何使用Spring Boot+Thymeleaf

本篇内容主要讲解“如何使用Spring Boot+Thymeleaf”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Spring Boot+Thymeleaf”吧!1. Thymeleaf
2023-06-15

利用Spring boot如何创建简单的web交互应用

关于页面渲染其实在工作中,一直都是前后端分离,也就是说,我的工作从来都是提供接口,而不写 html css js 之类的,所以在这方面也没有经验。这里为了给大家介绍下模板引擎,我将会写个非常非常简单的页面,如果不好看,请见谅~Spring
2023-05-31

如何在eclipse中创建一个spring boot项目

这期内容当中小编将会给大家带来有关如何在eclipse中创建一个spring boot项目,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。spring Boot是由Pivotal团队提供的全新框架,其设计目
2023-05-31

如何使用Docker创建FTP服务器

今天小编给大家分享一下如何使用Docker创建FTP服务器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.创建命令如下do
2023-06-29

Spring Boot中如何使用Starter

本篇内容主要讲解“Spring Boot中如何使用Starter”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot中如何使用Starter”吧!SpringBoot简介Spri
2023-06-16

java中Spring boot如何使用

这篇文章主要介绍“java中Spring boot如何使用”,在日常操作中,相信很多人在java中Spring boot如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中Spring boot如
2023-06-16

Lombok如何在Spring Boot中使用

本篇文章给大家分享的是有关Lombok如何在Spring Boot中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot是什么springboot一种全新的编
2023-06-14

JdbcTemplate如何在spring boot中使用

JdbcTemplate如何在spring boot中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Spring对数据库的操作在jdbc上面做了深层次的封装
2023-05-31

编程热搜

目录