容器化虚拟线程应用程序

在另一篇博文中,我们探讨了如何使用 Quarkus 实现一个 CRUD 应用程序来利用虚拟线程的强大功能。本文从该点继续,解释如何容器化应用程序。容器化涉及将应用程序打包成容器镜像,我们将为此目的使用 quarkus-container-image-jib 扩展。Quarkus 提供其他容器化扩展,例如 quarkus-container-image-docker,因此请选择最适合您的偏好的扩展。

使用虚拟线程打包应用程序与打包常规应用程序没有区别。Quarkus 隐藏了所有复杂性,选择正确的基镜像并配置原生镜像构建过程以使用正确的标志。

本博文的完整代码可在 virtual-threads-demos GitHub 仓库crud-example 目录中找到。

向项目添加 Jib

首先,将 quarkus-container-image-jib 扩展添加到项目中

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-container-image-jib</artifactId>
</dependency>

接下来,打开 application.properties 文件并添加以下属性

quarkus.container-image.build=true (1)
quarkus.container-image.name=virtual-threads-demos-${quarkus.application.name} (2)
  1. 启用容器镜像构建;每次运行 mvn package 时都会构建容器镜像。

  2. 定义容器镜像的名称。${quarkus.application.name} 占位符被替换为应用程序名称,在本例中为 crud-example

为 JVM 构建容器镜像

要创建 Java 应用程序的容器镜像,请运行以下命令

$ mvn clean package

日志将显示容器镜像的构建过程,镜像将使用 registry.access.redhat.com/ubi8/openjdk-21-runtime:1.18 基镜像构建。由于项目使用 Java 21,Quarkus 会自动选择此镜像。

请注意生成的镜像名称:clement/virtual-threads-demos-crud-example:1.0.0-SNAPSHOT。第一部分默认为您的用户名,因此请不要忘记在其他命令中更改它。

您可以使用以下命令运行容器镜像

$ docker run -it \
  -p8080:8080 \
  -e QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://docker.for.mac.localhost/rest-crud \
  clement/virtual-threads-demos-crud-example:1.0.0-SNAPSHOT

请确保将 clement 替换为您的用户名。

如果您在 ARM64 上运行,可能会遇到关于镜像平台不匹配的警告。您可以使用以下命令覆盖此设置:$ mvn clean package -DskipTests -Dquarkus.jib.platforms=linuxarm64

为原生可执行文件构建容器镜像

要为原生可执行文件构建容器镜像,请使用以下命令

$ mvn package -DskipTests \
  -Dnative \
  -Dquarkus.native.container-build=true \
  -Dquarkus.jib.platforms=linux/arm64

-Dnative 标志启用原生编译,-Dquarkus.jib.platforms=linux/arm64 指定目标平台(如果您在 ARM64 上运行是必需的,因为它默认会选择 linux/amd64)。

请注意属性 quarkus.native.container-build=true,它指示 Quarkus 使用容器镜像来构建原生可执行文件,从而无需安装 GraalVM。

使用以下命令运行容器镜像

$ docker run -it \
  -p8080:8080 \
  -e QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://docker.for.mac.localhost/rest-crud \
  clement/virtual-threads-demos-crud-example:1.0.0-SNAPSHOT

使用相同的配置技巧来连接数据库,并将 clement 替换为您的用户名。

推送容器镜像

Quarkus 可以将容器镜像推送到注册表。要推送到 GitHub 容器仓库,请使用以下属性

quarkus.container-image.registry=ghcr.io
quarkus.container-image.group=cescoffier
quarkus.container-image.username=cescoffier
quarkus.container-image.password=${GITHUB_TOKEN}

GITHUB_TOKEN 环境变量用于配置 GitHub token,该 token 必须具有创建包的权限。使用以下命令推送容器镜像

$ mvn clean package -DskipTests -Dquarkus.container-image.push=true

对于原生镜像,请附加 -Dnative

可以使用以下命令创建多架构容器镜像

$ mvn clean package -DskipTests -Dquarkus.container-image.push=true -Dquarkus.jib.platforms=linux/amd64,linux/arm64

此选项不适用于原生可执行文件,但是,对于 JVM 应用程序来说非常方便,因为您可以在不同平台上使用相同的容器镜像。

总结

这篇博文演示了如何使用 Quarkus 和 Jib 容器镜像扩展来容器化虚拟线程应用程序。涵盖了 JVM 应用程序和原生可执行文件。

细心的读者会发现,这与常规应用程序没有任何区别。Quarkus 处理了所有复杂性,选择了正确的基镜像并配置了原生镜像构建过程以使用正确的标志。