• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

详解如何用SpringBoot 2.3.0.M1创建Docker映像

springboot 搞代码 4年前 (2022-01-05) 46次浏览 已收录 0个评论

这篇文章主要介绍了详解如何用SpringBoot 2.3.0.M1创建Docker映像,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、发布

SpringBoot2.3.0.M1刚刚发布,它带来了一些有趣的新特性,可以帮助您将SpringBoot应用程序打包到Docker映像中。在这篇博客文章中,我们将查看创建Docker映像的典型方式,并展示如何通过使用这些新特性来改进这些镜像

2、说明

SpringBoot 2.3.0.M1 暂时不支持Windows, 很鸡肋
暂时在Mac 和Linux 上运行良好

3、常见的Docker 运行方式

一般情况下,通过docker 运行springboot 是这样的

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

4、常规方式通过docker 运行springboot 存在的问题
不是说常规方式不行,是他有一些可以改进的地方

1、在运行jar 的时候,没把jar 给解压缩,而是直接运行了,这会导致一些额外的开销,所以呢,最好能以没压缩的形式去运行
2、因为需要老是改代码,然后重新运行,上面那个代码就不那么的好用。因为你一般不会去修改依赖或者进行依赖升级这些操作,就是改改代码,适应业务变化,所以呢,最好能分个层,这样构建速度就快起来了

5、如何解决常规方式的不足呢

spring 提供了两项技术

1、buildpack
2、分层jar

如果您曾经使用过像CloudFoundry或Heroku这样的应用程序平台,那么你可能使用了一个buildpack,可能甚至没有意识到它是BuildPack平台的一部分,它将应用程序转换为平台实际可以运行的东西。例如,CloudFoundry的Javabuildpack会注意到您正在搞一个.jar文件并自动添加相关的JRE

最近呢,spring 摆脱了云本地构建包的一些束缚,让不能独立使用的这个东西呢,现在可以随时随地的构建与docker 兼容的docker 镜像了。

6、到底怎么构建

Maven 方式

1、先下载一个包,然后解压出来

 $ curl https://start.spring.io/starter.zip -d bootVersion=2.3.0.M1 -d dependencies=web -o demo.zip $ unzip demo.zip

2、然后呢构建镜像就行,但是要确保本地已经安装了docker 才行

 ./mvnw spring-boot:build-image

3、你会看到这么一些日志

 [INFO] Building image 'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] [INFO] > Pulling builder image 'docker.io/cloudfoundry/cnb:0.0.43-bionic' 100% [INFO] > Pulled builder image 'cloudfoundry/cnb@sha256:c983fb9602a7fb95b07d35ef432c04ad61ae8458263e7fb4ce62ca10de367c3b' [INFO] > Pulling run image 'docker.io/cloudfoundry/run:base-cnb' 100% [INFO] > Pulled run image 'cloudfoundry/run@sha256:ba9998ae4bb32ab43a7966c537aa1be153092ab0c7536eeef63bcd6336cbd0db' [INFO] > Executing lifecycle version v0.5.0 [INFO] > Using build cache volume 'pack-cache-5cbe5692dbc4.build' [INFO] [INFO] > Running detector [INFO]   [detector]  6 of 13 buildpacks participating ... [INFO] [INFO] > Running restorer [INFO]   [restorer]  Restoring cached layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' ... [INFO] [INFO] > Running cacher [INFO]   [cacher]   Reusing layer 'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [INFO]   [cacher]   Reusing layer 'org.cloudfoundry.jvmapplication:executable-jar' [INFO]   [cacher]   Caching layer 'org.cloudfoundry.springboot:spring-boot' [INFO]   [cacher]   Reusing layer 'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' [INFO] [INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT'

4、用docker 运行这个镜像

 docker run -it -p8080:8080 demo:0.0.1-SNAPSHOT

7、分层

SpringBoot提供的内置支持为开始使用内置包提供了一种很好的方式。因为它是buildpack平台规范的实现,所以很容易迁移到更强大的buildpack工具

最基本的springboot 的jar 文件内部格式

 META-INF/ MANIFEST.MF org/ springframework/ boot/ loader/ ... BOOT-INF/ classes/ ... lib/ ... 

分成了三层,一个是引导加载文件,一个是class 运行文件,一个是依赖关系

但是分层结构的jar 呢,会是这样的结构

 META-INF/ MANIFEST.MF org/ springframework/ boot/ loader/ ... BOOT-INF/ layers/ / classes/ ... lib/ ... / classes/ ... lib/ ... layers.idx 

他不再把lib 放到分开的独立的层里面,而是放到一起去了,然后分了几层。

并且多了一个 idx 文件,这个文件里面是添加层的顺序

最开始呢,分了这么些层,一来源gaodai#ma#com搞@@代~&码网共四个

1、dependencies(用于定期发布的依赖项)

2、snapshot-dependencies(用于快照依赖项)

3、resources(用于静态资源)

4、application(适用于应用程序类和资源)

这种分层是依据呢,是根据代码可能的更改来分离代码,一般呢,依赖项不太可能更改,因此他放在了独立的层里面

8、写分层形式的dockerfile

首先呢,需要在项目的POM 文件中增加一个支持

    org.springframework.bootspring-boot-maven-plugin LAYERED_JAR

jarmode是一个特殊的系统属性,您可以在启动JAR时设置它。它允许引导代码运行与应用程序完全不同的东西。例如,提取层的东西

这样就可以运行layertools 模式

 java -Djarmode=layertools -jar my-app.jar

项目搞好了呢,就重新编译打包

 mvn clean package

打包好了呢,我们就测试一下

 java -Djarmode=layertools -jar target/demo-0.0.1-SNAPSHOT.jar list

可以看到他输出了几个层

 dependencies snapshot-dependencies resources application

我们现在写一个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/snapshot-dependencies/ ./ COPY --from=builder application/resources/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

这是一个多阶段的docker 文件,他builder 提取了需要的文件,就是前面我们拆掉的四个层。全给他弄进去

然后我们开始构建

 docker build . --tag demo

构建完了,我们就跑他一下

 docker run -it -p8080:8080 demo:latest

以上就是详解如何用SpringBoot 2.3.0.M1创建Docker映像的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:详解如何用SpringBoot 2.3.0.M1创建Docker映像

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址