如何使用Google的Jib将SpringBoot应用Docker化

19-01-09 banq
         

方法。

这篇文章是关于利用Jib,更具体地说是jib-maven-plugin来构建容器化的spring boot应用程序。Jib可以让不写Dockerfile就能实现Docker打包。

这篇文章中使用的演示项目可以在这里找到。

什么是Jib

Jib带来的是,它允许您通过简单地将插件添加到您选择的构建工具(Maven或Gradle)来创建容器。没有额外的文件,只需几行配置,它处理将应用程序打包到容器映像的所有步骤。

使用Google云团队自己的话

Jib是来自Google的开源Java容器,它允许Java开发人员使用他们所知道的Java工具构建容器。它不需要您编写Dockerfile或安装了docker,它直接集成到MavenGradle中

在“传统”Java到Docker映像构建流程中,我们需要安装Dockerfile和docker守护进程。在Jib构建流程中,您只需要插件项目的构建文件。

构建

设置Java开发环境不属于本文的范围,但让我们试一试!

  1. 确保安装了Java 8+
  2. 我们将使用maven,所以如果不存在安装maven 3.5+
  3. 确保已安装 docker ,如果您使用的是Linux,则您的用户具有docker访问权限
  4. 安装了您最喜欢的IDE(eclipseidea

创建一个基本的spring boot应用程序

这可以通过spring initializr或您喜欢的IDE来完成。如果您使用了spring initializr,则需要将新创建的maven项目导入IDE(eclipse / idea)。

将jib-maven-plugin添加到您的pom.xml中

对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin :

<build>
   <plugins>
      <plugin>
        ...
      </plugin>
      ...
      <plugin>
         <groupId>com.google.cloud.tools</groupId>
         <artifactId>jib-maven-plugin</artifactId>
         <version>0.10.1</version>
         <configuration>
            <to>
               <image>springbootjib</image>
            </to>
         </configuration>‘

编译应用程序并构建镜像

现在我们可以构建应用程序并检查镜像是否在我们的本地docker存储库中创建。

通过终端转到项目的根文件夹,然后执行:

mvn compile jib:dockerBuild

Maven构建日志应包含如下行:

[INFO] — — jib-maven-plugin:0.10.1:dockerBuild (default-cli) @ spring-boot-jib — -
<p>[INFO] 
<p>[INFO] Containerizing application to Docker daemon as springbootjib…
<p>[WARNING] Base image ‘gcr.io/distroless/java’ does not use a specific image digest — build may not be reproducible
<p>[INFO] Getting base image gcr.io/distroless/java…
<p>[INFO] Building dependencies layer…
<p>[INFO] Building resources layer…
<p>[INFO] Building classes layer…
<p>[INFO] Finalizing…
<p>[INFO] 
<p>[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, com.jibdemo.SpringBootJibApplication]
<p>[INFO] Loading to Docker daemon…
<p>[INFO] 
<p>[INFO] Built image to Docker daemon as springbootjib

只要没有错误,我们就会看到maven“ Built image to Docker daemon as springbootjib”我们都已经确定了。

运行docker镜像

我们应该在本地存储库中拥有新的docker镜像。我们可以通过执行检查docker image ls,我们应该看到类似于这样的镜像:

springbootjib latest eb4bea693650 3 hours ago 135MB

请注意非常小的(135mb)镜像大小,这是由于gcr.io/distroless/javaJib默认使用的镜像(我们将在稍后看到如何更改)。

因此,现在我们可以像往常一样通过键入docker run -it springbootjib并验证应用程序是否按预期运行来运行镜像。

配置Jib插件以微调我们的Docker镜像

我们可以深入挖掘,并进一步配置Jib插件,以适应几种常见的场景,例如登录docker存储库,暴露端口,选择特定的基本映像等。

例如,在以下配置中:

  • 从openjdk:alpine(从Docker Hub拉出)的基础构建的
  • push推送到localhost:5000/springbootjib:0.0.1-SNAPSHOT,localhost:5000/springbootjib:alpine和localhost:5000/springbootjib:latest
  • 运行调用: java -Xms256m -Xdebug -cp app/libs/*:app/resources:app/classes com.jibdemo.SpringBootJibApplication some args
  • 公开端口8001用于tcp(默认),端口8002和8003用于udp
  • 设置一个标签(名称:springbootjib)
  • 构建为OCI格式

<configuration>
  <from>
    <image>openjdk:alpine</image>
  </from>
  <to>
    <image>localhost:5000/springbootjib:0.0.1-SNAPSHOT</image>
    <credHelper>osxkeychain</credHelper>
    <tags>
      <tag>alpine</tag>
      <tag>latest</tag>
    </tags>
  </to>
  <container>
    <jvmFlags>
      <jvmFlag>-Xms256m</jvmFlag>
      <jvmFlag>-Xdebug</jvmFlag>
    </jvmFlags>
    <ports>
      <port>8081</port>
      <port>8082-8083/udp</port>
    </ports>
    <labels>
      <name>springbootjib</name>
    </labels>
    <format>OCI</format>
  </container>
</configuration>

在,您可以再次构建镜像,并查看maven日志中的差异:

[INFO] --- jib-maven-plugin:0.10.1:dockerBuild (default-cli) @ spring-boot-jib ---
<p>[INFO] 
<p>[INFO] Containerizing application to Docker daemon as localhost:5000/springbootjib:0.0.1-SNAPSHOT, localhost:5000/springbootjib:alpine, localhost:5000/springbootjib...
<p>[INFO] Getting base image openjdk:alpine...
<p>[INFO] Building dependencies layer...
<p>[INFO] Building resources layer...
<p>[INFO] Building classes layer...
<p>[INFO] The base image requires auth. Trying again for openjdk:alpine...
<p>[INFO] Retrieving registry credentials for registry.hub.docker.com...
<p>[INFO] Finalizing...
<p>[INFO] 
<p>[INFO] Container entrypoint set to [java, -Xms256m, -Xdebug, -cp, /app/resources:/app/classes:/app/libs/*, com.jibdemo.SpringBootJibApplication]
<p>[INFO] Loading to Docker daemon...
<p>[INFO] 
<p>[INFO] Built image to Docker daemon as localhost:5000/springbootjib:0.0.1-SNAPSHOT, localhost:5000/springbootjib:alpine, localhost:5000/springbootjib

请注意,在上面的日志段中,插件openjdk:alpine从Docker Hub中提取镜像,将镜像构建为三个不同标记的版本,并将它们存储在我们的本地存储库中。

为什么用Jib?

  • 不需要维护Dockerfile,运行Docker守护程序,甚至无需创建具有所有依赖项的胖JAR。
  • 利用图像分层和注册表缓存来实现快速,增量的构建。
  • 只要输入保持不变,就可以将其配置为创建可重现的构建映像。

结论

如果使用过像spotifyfabric8那样的其他maven插件来为java应用程序创建docker图像,建议你使用Google的jib,它需要的文件少于fabric8的插件,并且(我认为)比spotify的插件更容易配置。我当然建议你试一试!