容器化虚拟线程应用程序
在另一篇博文中,我们探讨了如何使用 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)
-
启用容器镜像构建;每次运行
mvn package
时都会构建容器镜像。 -
定义容器镜像的名称。
${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 应用程序来说非常方便,因为您可以在不同平台上使用相同的容器镜像。