SpringBoot创建Docker镜像的方法步骤
随着越来越多的组织转向容器和虚拟服务器,Docker正成为软件开发工作流程中一个更重要的部分。为此,SpringBoot2.3中最新的功能之中,提供了为SpringBoot应用程序创建Docker镜像的能力。
这篇文章的目的,就是为了给大家介绍如何为SpringBoot应用程序创建Docker镜像。
1.传统Docker构建
使用SpringBoot构建Docker镜像的传统方法是使用Dockerfile。下面是一个简单的例子:
FROMopenjdk:8-jdk-alpine EXPOSE8080 ARGJAR_FILE=target/demo-app-1.0.0.jar ADD${JAR_FILE}app.jar ENTRYPOINT["java","-jar","/app.jar"]
然后我们可以使用dockerbuild命令来创建Docker映像。这对大多数应用程序都很好,但也有一些缺点。
首先,我们使用的是SpringBoot创建的fatjar。这会影响启动时间,尤其是在集装箱环境中。我们可以通过添加jar文件的分解内容来节省启动时间。
其次,Docker镜像是分层构建的。SpringBootfatjar的特性使得所有的应用程序代码和第三方库都放在一个层中。这意味着即使只有一行代码更改,也必须重新构建整个层。
通过在构建之前分解jar,应用程序代码和第三方库各自获得自己的层。这样,我们便可以利用Docker的缓存机制。现在,当某一行代码被更改时,只需要重新构建相应的层。
考虑到这一点,让我们看看SpringBoot如何改进创建Docker镜像的过程。
2.Buildpacks
BuildPacks是一种提供框架和应用程序依赖性的工具。
例如,给定一个SpringBootfatjar,一个buildpack将为我们提供Java运行时。这使我们可以跳过Dockerfile并自动获得一个合理的docker镜像。
SpringBoot包括对bulidpacks的Maven和Gradle支持。例如,使用Maven构建时,我们将运行以下命令:
./mvnwspring-boot:build-image
我们观察下一些相关的输出,看看发生了什么:
[INFO]Buildingjar:target/demo-0.0.1-SNAPSHOT.jar ... [INFO]Buildingimage'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO]>Pullingbuilderimage'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3'100% ... [INFO][creator]===>DETECTING [INFO][creator]5of15buildpacksparticipating [INFO][creator]paketo-buildpacks/bellsoft-liberica2.8.1 [INFO][creator]paketo-buildpacks/executable-jar1.2.8 [INFO][creator]paketo-buildpacks/apache-tomcat1.3.1 [INFO][creator]paketo-buildpacks/dist-zip1.3.6 [INFO][creator]paketo-buildpacks/spring-boot1.9.1 ... [INFO]Successfullybuiltimage'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO]Totaltime:44.796s
第一行显示我们构建了标准的fatjar,与其他典型的maven包一样。
下一行开始Docker映像构建。然后,看到这个bulid拉取了packeto构建器。
packeto是基于云原生bulidpacks的实现。它负责分析我们的项目并确定所需的框架和库。在我们的例子中,它确定我们有一个SpringBoot项目并添加所需的构建包。
最后,我们看到生成的Docker映像和总构建时间。注意,在第一次构建时,花了相当多的时间下载构建包并创建不同的层。
buildpacks的一大特点是Docker映像是多层的。因此,如果我们只更改应用程序代码,后续构建将更快:
... [INFO][creator]Reusinglayer'paketo-buildpacks/executable-jar:class-path' [INFO][creator]Reusinglayer'paketo-buildpacks/spring-boot:web-application-type' ... [INFO]Successfullybuiltimage'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO]Totaltime:10.591s
3.层级jar包
在某些情况下,我们可能不喜欢使用bulidpacks——也许我们的基础架构已经绑定到另一个工具上,或者我们已经有了我们想要重新使用的自定义Dockerfiles。
基于这些原因,SpringBoot还支持使用分层jars构建Docker映像。为了了解它的工作原理,让我们看看一个典型的SpringBootfatjar布局:
org/ springframework/ boot/ loader/ ... BOOT-INF/ classes/ ... lib/ ...
fatjar由3个主要区域组成:
- 启动Spring应用程序所需的引导类
- 应用程序代码
- 第三方库
使用分层jar,结构看起来很相似,但是我们得到了一个新的layers.idx将fatjar中的每个目录映射到一个层的文件:
-"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,SpringBootprovidesfourlayers:
开箱即用,SpringBoot提供4层:
- dependencies:来自第三方的依赖
- snapshot-dependencies:来自第三方的snapshot依赖
- resources:静态资源
- application:应用程序代码和资源(resources)
我们的目标是将应用程序代码和第三方库放置到层中,以反映它们更改的频率。
例如,应用程序代码可能是更改最频繁的代码,因此它有自己的层。此外,每一层都可以独立演化,只有当一层发生变化时,才会为它重建Docker镜像。
现在我们了解了分层jar结构,接下来看看如何利用它来制作Docker映像。
3.1.创建分层jar
首先,我们必须建立一个项目来创建一个分层的jar。对于Maven,则需要在POM的SpringBootplugin部分添加一个新的配置:
org.springframework.boot spring-boot-maven-plugin true
有了这个配置,Mavenpackage命令(包括它的其他依赖命令)将使用前面提到的四个默认层生成一个新的分层jar。
3.2.查看和提取分层
下一步,我们需要从jar中提取层,这样Docker镜像才能拥有正确的层。
要检查分层jar的任何层,可以运行以下命令:
java-Djarmode=layertools-jardemo-0.0.1.jarlist
然后提取它们,运行命令:
java-Djarmode=layertools-jardemo-0.0.1.jarextract
3.3.创建Docker映像
将这些层合并到Docker映像中的最简单方法是使用Dockerfile:
FROMadoptopenjdk:11-jre-hotspotasbuilder ARGJAR_FILE=target/*.jar COPY${JAR_FILE}application.jar RUNjava-Djarmode=layertools-jarapplication.jarextract FROMadoptopenjdk:11-jre-hotspot COPY--from=builderdependencies/./ COPY--from=buildersnapshot-dependencies/./ COPY--from=builderspring-boot-loader/./ COPY--from=builderapplication/./ ENTRYPOINT["java","org.springframework.boot.loader.JarLauncher"]
这个Dockerfile从fatjar中提取层,然后将每个层复制到Docker映像中。
每个COPY指令最终都会在Docker映像中生成一个新层。
如果我们构建这个Dockerfile,我们可以看到分层jar中的每个层都作为自己的层添加到Docker镜像中:
... Step6/10:COPY--from=builderdependencies/./ --->2c631b8f9993 Step7/10:COPY--from=buildersnapshot-dependencies/./ --->26e8ceb86b7d Step8/10:COPY--from=builderspring-boot-loader/./ --->6dd9eaddad7f Step9/10:COPY--from=builderapplication/./ --->dc80cc00a655 ...
4.总结
在本文中,我们学习了使用SpringBoot构建Docker映像的各种方法。
使用buildpacks,我们可以获得合适的Docker镜像,而无需模板或自定义配置。
或者,再多花点功夫,我们就可以使用分层jar来获得一个更加定制的Docker镜像。
到此这篇关于SpringBoot创建Docker镜像的方法步骤的文章就介绍到这了,更多相关SpringBoot创建Docker镜像内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!