Java微服务的简化Docker映像构建

使用Jib-Google的开源Java容器化程序

到目前为止,我们许多人将一直在使用Docker部署Java应用程序/微服务。而且为什么不这样呢,它已经成为当今应用程序部署的实际标准。

但是,需要正确学习和理解Docker才能实现最佳实践。我们许多人迷失了Dockerfile的复杂性。

在本文中,我将讨论一个非常酷的开源项目,该项目使我们能够使用简单的Maven / Gradle构建来构建和部署dockerized Java应用程序。

典型的Java应用程序Docker化过程

如果你是Java开发人员,并且想对你的应用程序进行docker化,那么你通常会遵循以下步骤:

使用Maven / Gradle构建构建一个Jar。

编写一个Dockerfile。

从Docker文件构建映像。

将映像推送到容器注册表。

作为Java开发人员,第一步很容易,但是到了下一步,我们大多数人都依赖Internet上可用的内容。典型的Dockerfile可能如下所示:

从open-jdk:8-jdk-alpine

COPY target / myapp-*。jar /app.jar

ENTRYPOINT java -jar /app.jar

如果使用此Dockerfile,我将能够构建应用程序的Docker映像并使用它,但这可能不是我可以构建的最有效的映像。

如果我在互联网上搜索更多内容,则可以通过遵循Dockerfile最佳实践来改进Dockerfile 。

上述Dockerfile存在各种问题。

这是使用JDK基本映像而不是JRE。在运行应用程序时,需要JRE,而不是JDK。如果我们对此进行更改,那么我们将能够大大减小图像尺寸。JRE映像大约为55 MB,而JDK映像为192 MB。

该应用程序是使用Jar构建的,这意味着在Docker映像中仅为此应用程序创建了一层。如果进行任何更改,那么每次我们推送应用程序的整个层时,都需要重新构建它。我们可以通过将依赖项和应用程序代码分离到不同的层中来改善这一点。您可以实现分离使用以下Maven命令的依赖关系:mvn dependency:copy-dependencies -DoutputDirector=target/dependencies。

因此,经过改进后,Dockerfile将如下所示:

FROM open-jdk:8-jre-alpine

COPY目标/依赖项/ app / dependencies

COPY目标/资源/ app /资源

COPY目标/类/ app /类

ENTRYPOINT java -cp / app / dependencies / *:/ app / resources / :/ app / classes hello.Application

Jib介绍

Jib是Google的开放源代码Java容器化程序,允许开发人员从Maven / Gradle构建中构建其Java应用程序的Docker映像。

如上所示,如果你不熟悉最佳实践,则Docker映像构建是一个复杂的过程。Jib尝试解决此问题,但提供了Maven和Gradle构建插件。

因此,如果你必须构建Java应用程序的Docker映像,则只需做两件事。

在中添加Maven依赖项pom.xml。

com.google.cloud.tools

jib-maven-plugin

1.8.0

/ hello-jib

2.运行以下命令:

mvn compile jib:build

这将在内部应用Docker最佳实践,将您的应用程序分成多个层,构建映像,然后推送到容器存储库。

Jib的好处

使用Jib有许多好处。

作为Java开发人员,我需要做的只是专注于Java,而不必担心Docker的复杂性。

由于这是Maven / Gradle构建的一部分,因此实现和部署速度很快。

由于Jib使用Docker最佳实践,因此构建的映像是轻量级的,标准的和分层的。

您不需要Docker守护程序来创建和推送Docker映像。

Docker与Jib

这是两种方法之间直接比较的一些结果。

参考文献:

https://speakerdeck.com/coollog/build-containers-faster-with-jib-a-google-image-build-tool-for-java-applications

https://github.com/GoogleContainerTools/jib