使用Jib对Java应用进行Docker化

2023/05/12

1. 概述

在本教程中,我们将了解Jib以及它如何简化Java应用程序的容器化。

我们将使用一个简单的Spring Boot应用程序并使用Jib构建它的Docker镜像。然后,我们还会将镜像发布到远程注册中心。

并确保还参考了我们关于使用Dockerfile和Docker工具对Spring Boot应用程序进行容器化的教程。

2. Jib简介

Jib是由Google维护的开源Java工具,用于构建Java应用程序的Docker镜像。它简化了容器化,因为有了它,我们不需要编写Dockerfile

实际上,我们甚至不必安装Docker就可以自己创建和发布Docker镜像

Google将Jib作为Maven和Gradle插件发布。这很好,因为这意味着每次构建时Jib都会捕获我们对应用程序所做的任何更改。这为我们节省了单独的docker build/push命令,并简化了将其添加到CI管道的过程

还有一些其他工具,例如Spotify的docker-maven-plugindockerfile-maven插件,但是前者现在已被弃用,而后者需要Dockerfile。

3. 一个简单的问候应用程序

让我们以一个简单的Spring Boot应用程序为例,并使用Jib将其容器化。它将公开一个简单的GET端点:

http://localhost:8080/greeting

我们可以简单地使用Spring MVC控制器来完成:

@RestController
public class GreetingController {
    private static final String template = "Hello Docker, %s!";
    
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

4. 准备部署

我们还需要在本地进行设置,以使用我们要部署到的Docker仓库进行身份验证。

对于此示例,我们将向.m2/settings.xml提供我们的DockerHub凭据

<servers>
    <server>
        <id>registry.hub.docker.com</id>
        <username>{DockerHub Username}</username>
        <password>{DockerHub Password}</password>
    </server>
</servers>

还有其他方法可以提供凭据。Google推荐的方法是使用辅助工具,它可以将凭证以加密格式存储在文件系统中。在此示例中,我们可以使用docker-credential-helpers而不是将纯文本凭证存储在settings.xml中,这样更安全,但不在本教程的范围内。

5. 使用Jib部署到DockerHub

现在,我们可以使用jib-maven-plugin或Gradle等效插件,通过一个简单的命令将我们的应用程序容器化

mvn compile com.google.cloud.tools:jib-maven-plugin:2.5.0:build -Dimage=$IMAGE_PATH

其中IMAGE_PATH是容器注册中心中的目标路径。

例如,要将镜像tuyuchengjib/spring-jib-app上传到DockerHub,我们将执行以下操作:

export IMAGE_PATH=registry.hub.docker.com/tuyuchengjib/spring-jib-app

就是这样!这将构建我们应用程序的Docker镜像并将其推送到DockerHub。

当然,我们可以通过类似的方式将镜像上传到Google Container Registry或者Amazon Elastic Container Registry

6. 简化Maven命令

此外,我们可以通过在pom中配置插件来缩短我们的初始命令,就像任何其他Maven插件一样。

<project>
    <!--...-->
    <build>
        <plugins>
            <!--...-->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.5.0</version>
                <configuration>
                    <to>
                        <image>${image.path}</image>
                    </to>
                </configuration>
            </plugin>
            <!--...-->
        </plugins>
    </build>
    <!--...-->
</project>

通过此更改,我们可以简化Maven命令:

mvn compile jib:build

7. 自定义Docker方面

默认情况下,Jib会对我们想要的内容进行一些合理的猜测,例如FROM和ENTRYPOINT。

让我们对我们的应用程序进行一些更符合我们需求的更改。

首先,Spring Boot默认暴露了8080端口。

但是,比方说,我们想让我们的应用程序在端口8082上运行并使其可通过容器公开。

当然,我们会在Boot中进行适当的更改。之后,我们可以使用Jib使其在镜像中可公开:

<configuration>
    <!--...-->
    <container>
        <ports>
            <port>8082</port>
        </ports>
    </container>
</configuration>

或者,假设我们需要一个不同的FROM。默认情况下,Jib使用无发行版的Java镜像

如果我们想在不同的基础镜像(比如alpine-java)上运行我们的应用程序,我们可以用类似的方式配置它:

<configuration>
    <!--...-->
    <from>
        <image>openjdk:alpine</image>
    </from>
    <!--...-->
</configuration>

我们以相同的方式配置tags、volumes和其他几个Docker指令

8. 自定义Java方面

而且,通过关联,Jib也支持许多Java运行时配置:

  • jvmFlags用于指示要传递给JVM的启动标志。
  • mainClass用于指示主类,默认情况下Jib将尝试自动推断
  • args是我们指定传递给main方法的程序参数的地方。

当然,请务必查看Jib的文档以查看所有可用的配置属性

9. 总结

在本教程中,我们了解了如何使用Google的Jib构建和发布Docker镜像,包括如何通过Maven访问Docker指令和Java运行时配置。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章