将 Go Web 应用部署到 Azure 容器应用

本快速入门介绍如何将容器化 Go Web 应用部署到 Azure 容器应用。

使用 Azure 容器应用可以执行打包在任何容器中的应用程序代码,而无需管理复杂的云基础结构或复杂的容器业务流程协调程序,也无需担心运行时或编程模型。 Azure 容器应用的常见用途包括:部署 API 终结点、托管后台处理应用程序、处理事件驱动的处理以及运行微服务。

按照本教程的指导,逐步构建 Docker 映像、将该映像部署到 Azure 容器注册表,以及将 Go Web 应用部署到 Azure 容器应用。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

安装

若要从 CLI 登录到 Azure,请运行 az login 命令,然后按照提示完成身份验证过程。

az login

为了确保运行最新版本的 CLI,请运行 az upgrade 命令。

az upgrade

接下来,安装或更新适用于 CLI 的 Azure 容器应用扩展。

如果在 Azure CLI 中运行 az containerapp 命令时收到有关缺少参数的错误,请确保已安装最新版本的 Azure 容器应用扩展。

az extension add --name containerapp --upgrade

注意

从 2024 年 5 月开始,Azure CLI 扩展不再默认启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true 安装容器应用扩展。

az extension add --name containerapp --upgrade --allow-preview true

现在已安装当前扩展或模块,接下来请注册 Microsoft.AppMicrosoft.OperationalInsights 命名空间。

注意

Azure 容器应用资源已从 Microsoft.Web 命名空间迁移到 Microsoft.App 命名空间。 有关详细信息,请参阅 2022 年 3 月从 Microsoft.Web 到 Microsoft.App 的命名空间迁移

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

下载示例应用

若要学习本教程,你需要一个用于容器化的示例应用程序。 msdocs-go-webapp-quickstart GitHub 存储库中提供了一个示例 Go Web 应用。 将示例应用程序下载或克隆到本地工作站。

git clone https://github.com/Azure-Samples/msdocs-go-webapp-quickstart.git

cd msdocs-go-webapp-quickstart

创建 Azure 容器注册表

Azure 容器注册表用于生成、存储和管理容器映像。 你将使用它来存储 Docker 映像,其中包含前面提到的示例存储库中提供的示例 Go Web 应用。

运行以下命令,创建一个 Azure 容器注册表:

  1. 使用 az group create 命令创建 Azure 资源组。

    
    
    az group create \
        --name <resourceGroupName> \
        --location eastus
    
  2. 使用 az acr create 命令创建 Azure 容器注册表。

    az acr create \
        --resource-group <resourceGroupName> \
        --name <azureContainerRegistryName> \
        --sku basic
    
  3. 使用 az acr login 命令登录到 Azure 容器实例。

    az acr login --name <azureContainerRegistryName>  
    

<resourceGroupName><azureContainerRegistryName> 替换为相应的值。 Azure 容器注册表名称需要全局唯一。

注意

如果在运行 az acr login 命令时出现类似以下的错误,请确保 Docker 守护程序正在你的系统上运行:

You may want to use 'az acr login -n <azureContainerRegistryName> --expose-token' to get an access token, which does not require Docker to be installed.
2024-09-12 17:25:25.127779 An error occurred: DOCKER_COMMAND_ERROR

生成并推送 Docker 映像

创建 Azure 容器注册表后,生成并推送示例 Go Web 应用的 Docker 映像。

运行以下命令,生成映像并将其推送到注册表:

  1. 使用 az acr show 命令获取登录服务器信息。

    az acr show \
        --name <azureContainerRegistryName> \
        --resource-group <resourceGroupName> \
        --query loginServer \
        --output tsv  
    
  2. 在本地生成 Docker 映像。

    docker build -t <loginServer>/<imageName>:latest .
    
  3. 向 Azure 容器注册表推送 Docker 映像。

    docker push <loginServer>/<imageName>:latest
    
  4. 使用 az acr repository list 命令验证映像是否已成功推送到 Azure 容器注册表。

    az acr repository list \
        --name <azureContainerRegistryName> \
        --output table
    

loginServerimageNameazureContainerRegistryName 替换为适当的值。 映像名称是推送到 Azure 容器注册表的 Docker 映像,稍后用于部署到 Azure 容器应用。

现在,Azure 容器注册表中提供了一个映像,可以部署 Azure 容器应用及其环境。

创建 Azure 容器应用环境

Azure 容器应用没有容器业务流程协调程序的复杂性,但它仍然需要某种方法来建立安全边界,这是 Azure 容器应用环境所处的位置。 同一环境中的容器应用共享同一个虚拟网络中,并将日志写入同一个 Log Analytics 工作区。 在部署 Azure 容器应用之前,你需要一个要部署的环境。

  • 运行 az containerapp env create 命令,以创建 Azure 容器应用环境。

    az containerapp env create \
        --name <containerAppEnvName> \
        --resource-group <resourceGroupName> \
        --location "East US"
    

部署到 Azure 容器应用

此时,你已创建一个 Azure 容器注册表,生成并推送了 Docker 映像并将其推送到其中,并创建了 Azure 容器应用环境。 剩下的工作就是部署应用程序。

运行 az containerapp create 命令,将 Go Web 应用部署到 Azure 容器应用。

az containerapp create \
    --name <containerAppName> \
    --resource-group <resourceGroupName> \
    --environment <containerAppEnvName> \
    --image "<loginServer>/<imageName>:latest" \
    --registry-server "<loginServer>" \
    --registry-identity system \
    --target-port 8080 \
    --ingress external

--registry-identity system 参数在容器应用上配置系统分配的托管标识。 容器应用使用此标识而不是不太安全的用户名/密码对容器注册表进行身份验证。 该命令还会自动为标识创建AcrPull角色分配,以便它有权从注册表拉取映像。 若要使用托管标识进行身份验证和授权,注册表必须是 Azure 容器注册表。

验证 Web 应用 URL

运行 containerapp show 命令,以获取 Web 应用程序的入口的 FQDN(完全限定域名)。

APP_FQDN=$(az containerapp show \
    --name <containerAppName> \
    --resource-group <resourceGroupName> \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

接下来,对 FQDN 运行 curl 命令,并确认输出反映了网站的 HTML。

curl "https://$APP_FQDN"

清理资源

在使用完该示例应用后,可从 Azure 中删除该应用的所有资源。 这样做可以避免持续收费,并使 Azure 订阅保持整洁。 删除资源组还会删除资源组中的所有资源,这也是为应用删除所有 Azure 资源的最快方法。

运行 az group delete 命令,删除资源组及其所有资源.

az group delete \
    --name <resourceGroupName> \
    --no-wait

后续步骤