将 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.ContainerRegistryMicrosoft.OperationalInsights命名空间。

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

注意

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

下载示例应用

若要学习本教程,你需要一个用于容器化的示例应用程序。 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. 为要创建的资源设置环境变量。 将括号中的占位符文本替换为相应的值。 Azure 容器注册表名称需要全局唯一。

    RESOURCE_GROUP_NAME="<resourceGroupName>"  # Name of the Azure resource group to create
    LOCATION="<location>"                      # Azure region (For example, "eastus", "westus2")
    ACR_NAME="<azureContainerRegistryName>"    # Globally unique name for Azure Container Registry
    

    用于设置环境变量的示例命令适用于 Bash shell。 如果使用的是其他 shell,请相应地调整命令。

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

    az group create \
        --name $RESOURCE_GROUP_NAME \
        --location $LOCATION
    
  3. 使用 az acr create 命令创建 Azure 容器注册表。

    az acr create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $ACR_NAME \
        --sku basic
    
  4. 使用 az acr login 命令登录到 Azure 容器实例。

    az acr login --name $ACR_NAME
    

    注意

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

    You may want to use 'az acr login -n $ACR_NAME --expose-token' to get an access token, which doesn't require Docker to be installed.
    An error occurred: DOCKER_COMMAND_ERROR
    

生成并推送 Docker 映像

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

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

  1. 为要创建的 Docker 映像设置环境变量。 将括号中的占位符文本替换为相应的值。

    IMAGE_NAME="go-webapp"  # Name for the Docker image
    

    用于设置环境变量的示例命令适用于 Bash shell。 如果使用的是其他 shell,请相应地调整命令。

  2. 使用 az acr show 命令获取登录服务器信息,并将其存储在环境变量中。

    LOGIN_SERVER=$(az acr show \
        --name $ACR_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query loginServer \
        --output tsv)
    
    echo "Login server: $LOGIN_SERVER"
    
  3. 在本地生成 Docker 映像。

    docker build -t $LOGIN_SERVER/$IMAGE_NAME:latest .
    
  4. 向 Azure 容器注册表推送 Docker 映像。

    docker push $LOGIN_SERVER/$IMAGE_NAME:latest
    
  5. 使用 az acr repository list 命令验证映像是否已成功推送到 Azure 容器注册表。

    az acr repository list \
        --name $ACR_NAME \
        --output table
    

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

创建 Azure 容器应用环境

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

  1. 为要创建的资源设置环境变量。 将括号中的占位符文本替换为相应的值。

    CONTAINER_APP_ENV="mygoappenv"  # Name for the Container Apps environment
    CONTAINER_APP_NAME="mygoapp"    # Name for your container app
    

    用于设置环境变量的示例命令适用于 Bash shell。 如果使用的是其他 shell,请相应地调整命令。

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

    az containerapp env create \
        --name $CONTAINER_APP_ENV \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $LOCATION
    

部署到 Azure 容器应用

此时,你已完成以下步骤:

  • 创建了 Azure 容器注册表。
  • 生成 Docker 映像并将其推送到注册表。
  • 设置 Azure 容器应用环境。

最后一步是部署应用程序。

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

az containerapp create \
    --name $CONTAINER_APP_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --environment $CONTAINER_APP_ENV \
    --image "$LOGIN_SERVER/$IMAGE_NAME:latest" \
    --registry-server "$LOGIN_SERVER" \
    --registry-identity system \
    --target-port 8080 \
    --ingress external

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

验证 Web 应用 URL

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

    APP_FQDN=$(az containerapp show \
        --name $CONTAINER_APP_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query properties.configuration.ingress.fqdn \
        --output tsv)
    
    echo "App URL: https://$APP_FQDN"
    
  2. 针对 FQDN 运行 curl 命令,并确认输出反映网站的 HTML。 还可以在 Web 浏览器中打开 URL 以与 Web 应用交互。

    curl "https://$APP_FQDN"
    

    命令返回 Web 应用的主页的 HTML,如下所示:

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>Hello Azure - Go Quickstart</title>
        <link rel="stylesheet" href="/assets/main.css">
        <link rel="icon" type="image/x-icon" href="/assets/favicon.ico">
    </head>
    
    <header>
        <h1>Welcome to Azure</h1>
    </header>
    
    <section>
        <img src="/assets/images/azure-icon.svg">
        <form method="post">
            <label for="form-label">Could you please tell me your name?</label><br>
            <input type="text" id="name" name="name" style="max-width: 256px;"><br>
            <button type="submit">Say Hello</button>
        </form>
    </section>
    
    </html>
    

清理资源

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

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

az group delete \
    --name $RESOURCE_GROUP_NAME \
    --no-wait

后续步骤