详解如何用SpringBoot 2.3.0.M1创建Docker映像
1、发布
SpringBoot2.3.0.M1刚刚发布,它带来了一些有趣的新特性,可以帮助您将SpringBoot应用程序打包到Docker映像中。在这篇博客文章中,我们将查看创建Docker映像的典型方式,并展示如何通过使用这些新特性来改进这些镜像
2、说明
SpringBoot2.3.0.M1暂时不支持Windows,很鸡肋
暂时在Mac和Linux上运行良好
3、常见的Docker运行方式
一般情况下,通过docker运行springboot是这样的
FROMopenjdk:8-jdk-alpine EXPOSE8080 ARGJAR_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、先下载一个包,然后解压出来
$curlhttps://start.spring.io/starter.zip-dbootVersion=2.3.0.M1-ddependencies=web-odemo.zip $unzipdemo.zip
2、然后呢构建镜像就行,但是要确保本地已经安装了docker才行
./mvnwspring-boot:build-image
3、你会看到这么一些日志
[INFO]Buildingimage'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] [INFO]>Pullingbuilderimage'docker.io/cloudfoundry/cnb:0.0.43-bionic'100% [INFO]>Pulledbuilderimage'cloudfoundry/cnb@sha256:c983fb9602a7fb95b07d35ef432c04ad61ae8458263e7fb4ce62ca10de367c3b' [INFO]>Pullingrunimage'docker.io/cloudfoundry/run:base-cnb'100% [INFO]>Pulledrunimage'cloudfoundry/run@sha256:ba9998ae4bb32ab43a7966c537aa1be153092ab0c7536eeef63bcd6336cbd0db' [INFO]>Executinglifecycleversionv0.5.0 [INFO]>Usingbuildcachevolume'pack-cache-5cbe5692dbc4.build' [INFO] [INFO]>Runningdetector [INFO][detector]6of13buildpacksparticipating ... [INFO] [INFO]>Runningrestorer [INFO][restorer]Restoringcachedlayer'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' ... [INFO] [INFO]>Runningcacher [INFO][cacher]Reusinglayer'org.cloudfoundry.openjdk:2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b' [INFO][cacher]Reusinglayer'org.cloudfoundry.jvmapplication:executable-jar' [INFO][cacher]Cachinglayer'org.cloudfoundry.springboot:spring-boot' [INFO][cacher]Reusinglayer'org.cloudfoundry.springautoreconfiguration:46ab131165317d91fd4ad3186abf755222744e2d277dc413def06f3ad45ab150' [INFO] [INFO]Successfullybuiltimage'docker.io/library/demo:0.0.1-SNAPSHOT'
4、用docker运行这个镜像
dockerrun-it-p8080:8080demo: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文件,这个文件里面是添加层的顺序
最开始呢,分了这么些层,一共四个
1、dependencies(用于定期发布的依赖项)
2、snapshot-dependencies(用于快照依赖项)
3、resources(用于静态资源)
4、application(适用于应用程序类和资源)
这种分层是依据呢,是根据代码可能的更改来分离代码,一般呢,依赖项不太可能更改,因此他放在了独立的层里面
8、写分层形式的dockerfile
首先呢,需要在项目的POM文件中增加一个支持
org.springframework.boot spring-boot-maven-plugin LAYERED_JAR
jarmode是一个特殊的系统属性,您可以在启动JAR时设置它。它允许引导代码运行与应用程序完全不同的东西。例如,提取层的东西
这样就可以运行layertools模式
java-Djarmode=layertools-jarmy-app.jar
项目搞好了呢,就重新编译打包
mvncleanpackage
打包好了呢,我们就测试一下
java-Djarmode=layertools-jartarget/demo-0.0.1-SNAPSHOT.jarlist
可以看到他输出了几个层
dependencies snapshot-dependencies resources application
我们现在写一个dockerfile来提取并复制这几个层来构建镜像
FROMadoptopenjdk:11-jre-hotspotasbuilder WORKDIRapplication ARGJAR_FILE=target/*.jar COPY${JAR_FILE}application.jar RUNjava-Djarmode=layertools-jarapplication.jarextract FROMadoptopenjdk:11-jre-hotspot WORKDIRapplication COPY--from=builderapplication/dependencies/./ COPY--from=builderapplication/snapshot-dependencies/./ COPY--from=builderapplication/resources/./ COPY--from=builderapplication/application/./ ENTRYPOINT["java","org.springframework.boot.loader.JarLauncher"]
这是一个多阶段的docker文件,他builder提取了需要的文件,就是前面我们拆掉的四个层。全给他弄进去
然后我们开始构建
dockerbuild.--tagdemo
构建完了,我们就跑他一下
dockerrun-it-p8080:8080demo:latest
到此这篇关于详解如何用SpringBoot2.3.0.M1创建Docker映像的文章就介绍到这了,更多相关SpringBoot2.3.0.M1创建Docker映像内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!