将 Go Web 应用部署到 Azure 容器应用
本快速入门介绍如何将容器化 Go Web 应用部署到 Azure 容器应用。
使用 Azure 容器应用可以执行打包在任何容器中的应用程序代码,而无需管理复杂的云基础结构或复杂的容器业务流程协调程序,也无需担心运行时或编程模型。 Azure 容器应用的常见用途包括:部署 API 终结点、托管后台处理应用程序、处理事件驱动的处理以及运行微服务。
按照本教程的指导,逐步构建 Docker 映像、将该映像部署到 Azure 容器注册表,以及将 Go Web 应用部署到 Azure 容器应用。
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
- 已安装 Go:版本 1.18 或更高版本
- Docker Desktop
安装
若要从 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.App
和 Microsoft.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 容器注册表:
使用 az group create 命令创建 Azure 资源组。
az group create \ --name <resourceGroupName> \ --location eastus
使用 az acr create 命令创建 Azure 容器注册表。
az acr create \ --resource-group <resourceGroupName> \ --name <azureContainerRegistryName> \ --sku basic
使用 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 映像。
运行以下命令,生成映像并将其推送到注册表:
使用 az acr show 命令获取登录服务器信息。
az acr show \ --name <azureContainerRegistryName> \ --resource-group <resourceGroupName> \ --query loginServer \ --output tsv
在本地生成 Docker 映像。
docker build -t <loginServer>/<imageName>:latest .
向 Azure 容器注册表推送 Docker 映像。
docker push <loginServer>/<imageName>:latest
使用 az acr repository list 命令验证映像是否已成功推送到 Azure 容器注册表。
az acr repository list \ --name <azureContainerRegistryName> \ --output table
将 loginServer
、imageName
和 azureContainerRegistryName
替换为适当的值。 映像名称是推送到 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