将 Quarkus 应用程序部署到 Azure 容器应用

已完成

在本单元中,你将使用 Azure CLI 创建 Azure 容器应用环境。

为 Quarkus 应用程序设置 Dockerfile

容器应用用于部署容器化应用程序。 因此,首先需要将 Quarkus 应用程序容器化到 Docker 映像中。 此过程很简单,因为 Quarkus Maven 插件已在 src/main/docker下生成了一些 Dockerfiles。

使用此命令将其中一个 Dockerfiles、Dockerfile.jvm 重命名为 Dockerfile 并将其移动到根文件夹:

mv src/main/docker/Dockerfile.jvm ./Dockerfile

将 Dockerfile 中长注释后的内容替换为以下内容:

FROM registry.access.redhat.com/ubi8/openjdk-17:1.18

ENV LANGUAGE='en_US:en'


# We make four distinct layers so if there are application changes the library layers can be re-used
COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=185 target/quarkus-app/*.jar /deployments/
COPY --chown=185 target/quarkus-app/app/ /deployments/app/
COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/

EXPOSE 8080
USER 185
ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]

此 Dockerfile 要求 Quarkus 应用程序打包为 quarkus-run.jar 文件。 将此名称打包为 JAR 文件时,此名称是 Quarkus 应用程序的默认名称。 需要确保 Quarkus 应用程序打包为 JAR 文件。 为此,请运行以下 Maven 命令:

./mvnw package    # On Mac or Linux
mvnw.cmd package  # On Windows

此命令将 Quarkus 应用程序打包到 JAR 文件中,并在目标/quarkus-app 文件夹中生成quarkus-run.jar文件。

创建容器应用环境并部署容器

现在 Dockerfile 位于正确的位置,接下来可以使用单个 Azure CLI 命令创建容器应用环境并部署容器。 在项目的根目录中运行以下命令:

az containerapp up \
    --name "$AZ_CONTAINERAPP" \
    --environment "$AZ_CONTAINERAPP_ENV" \
    --___location "$AZ_LOCATION" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --ingress external \
    --target-port 8080 \
    --source .

此命令执行多项作:

  • 创建容器应用环境(如果不存在)
  • 创建 Azure 注册表(如果不存在)
  • 创建 Log Analytics 工作区(如果不存在)
  • 生成 Docker 映像并将其推送到 Azure 注册表
  • 将 Docker 映像部署到容器应用环境

az containerapp up 命令需要一些时间才能运行。 应会看到类似于以下内容的输出:

Using resource group 'rgazure-deploy-quarkus'
Creating ContainerAppEnvironment 'caeazure-deploy-quarkus' in resource group rgazure-deploy-quarkus
No Log Analytics workspace provided.
Generating a Log Analytics workspace with name "workspace-rgazuredeployquarkusEED7"
Creating Azure Container Registry ca001ad52ae7acr in resource group rgazure-deploy-quarkus

Run ID: ca3 was successful after 41s
Creating Containerapp caazure-deploy-quarkus in resource group rgazure-deploy-quarkus
Adding registry password as a secret with name "ca001ad52ae7acrazurecrio-ca001nxc57acr"

Your container app caazure-deploy-quarkus has been created and deployed! Congrats! 

验证部署

可以通过多种方式验证部署是否已成功。 最简单的方法是在 Azure 门户中搜索资源组。 应会看到类似于以下内容的资源:

显示已部署应用程序的屏幕截图。

还可以运行以下命令来检查部署。 其中列出了 az containerapp up 命令创建的所有资源。

az resource list \
    --___location "$AZ_LOCATION" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --output table

应会看到如下所示的输出:

Name                                ResourceGroup           Location    Type                                       Status
----------------------------------  ----------------------  ----------  -----------------------------------------  --------
caea3a6e0afeacr                     rgazure-deploy-quarkus  eastus      Microsoft.ContainerRegistry/registries
psqlazure-deploy-quarkus            rgazure-deploy-quarkus  eastus      Microsoft.DBforPostgreSQL/flexibleServers
caazure-deploy-quarkus              rgazure-deploy-quarkus  eastus      Microsoft.App/containerApps
caeazure-deploy-quarkus             rgazure-deploy-quarkus  eastus      Microsoft.App/managedEnvironments
workspace-rgazuredeployquarkuscDD3  rgazure-deploy-quarkus  eastus      Microsoft.OperationalInsights/workspaces

验证已部署的应用程序

现在可以验证已部署的应用程序。 首先,需要获取应用程序的 URL。 可以通过运行以下命令来获取它:

export AZ_APP_URL=$(
    az containerapp show \
        --name "$AZ_CONTAINERAPP" \
        --resource-group "$AZ_RESOURCE_GROUP" \
        --query "properties.configuration.ingress.fqdn" \
        --output tsv \
)

echo "AZ_APP_URL=$AZ_APP_URL"

应用程序已准备就绪,https://<app-name>.azurecontainerapps.io/。 请注意 https 协议。 之所以使用该协议,是因为应用程序是使用 TLS 证书部署的。 若要测试应用程序,可以使用 cURL:

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Configuration","details":"Congratulations, you have set up your Quarkus application correctly!","done": "true"}' \
    https://$AZ_APP_URL/api/todos

使用新的 cURL 请求检索数据:

curl https://$AZ_APP_URL/api/todos

此命令返回数据库中所有 to-do 项的列表:

[
   {
      "description" : "Take Quarkus MS Learn",
      "details" : "Take the MS Learn on deploying Quarkus to Azure Container Apps",
      "done" : true,
      "id" : 1
   },
   {
      "description" : "Take Azure Container MS Learn",
      "details" : "Take the ACA Learn module",
      "done" : false,
      "id" : 2
   },
   {
      "description" : "Configuration",
      "details" : "Congratulations, you have set up your Quarkus application correctly!",
      "done" : true,
      "id" : 3
   }
]

如果运行此命令,可以在创建新的 to-dos 时流式传输容器的日志:

az containerapp logs show \
    --name "$AZ_CONTAINERAPP" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --follow

运行更多 cURL 命令。 应会在终端中看到日志滚动。

curl https://$AZ_APP_URL/api/todos

注释

你还可以在 Web 浏览器中打开 URL 以返回待办事项列表。