你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何使用你偏好的编程语言,从计算机上的源代码生成应用程序并将其部署到 Azure 容器应用中。
本教程介绍以下内容:
- 创建简单的 Web 应用程序。
- 为应用创建关联的 Dockerfile。
- 从编译的代码创建映像并将其推送到容器注册表。
- 使用托管标识安全地访问容器注册表。
- 将容器部署到 Azure 容器应用。
- 在浏览器中查看应用以验证部署。
先决条件
若要完成此项目,需要满足以下条件:
要求 | 说明 |
---|---|
Azure 帐户 | 如果你没有帐户,请免费创建一个。 需要拥有 Azure 订阅的“参与者”或“所有者”权限才能继续操作。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色。 |
Azure CLI | 安装 Azure CLI 或升级到最新版本。 Azure Developer CLI(azd 命令)可通过 Azure CLI 获得。 |
根据你选择的语言,你可能还需要安装相应的运行时、SDK 和其他依赖项。
安装 .NET SDK。
创建本地应用程序
以下步骤显示了生成要在 Azure 容器应用上部署的示例应用程序所需的代码和依赖项。
注意
如果你想使用未列出的其他语言,请在你偏好的 AI 模型中输入以下提示。
在提交提示之前,请将 <LANGUAGE>
替换为你选择的语言。
Generate the simplest possible "hello world" web server in idiomatic <LANGUAGE>.
Make sure to include any dependencies required for the application to run locally and in production.
创建并运行源代码。
创建新 C# 项目。
dotnet new webapp --name MyAcaDemo --language C#
更改为 MyAcaDemo 文件夹。
cd MyAcaDemo
在代码编辑器中打开
Program.cs
,并将内容替换为以下代码。public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.UseUrls("http://*:8080"); }); }
使用此代码实现
Program
类会创建 Web 应用程序的基础。 接下来,创建一个负责返回网页作为响应的类。在同一文件夹中,创建一个名为
Startup.cs
的新文件,并输入以下代码。public class Startup { public void ConfigureServices(IServiceCollection services) { } public void Configure(IApplicationBuilder app) { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); }); } }
现在,当对 Web 应用程序发出请求时,会返回文本“Hello World!”。 若要验证代码在本地计算机上是否正常运行,请在发布配置中生成项目。
dotnet build -c Release
接下来,运行应用程序以验证代码是否已正确实现。
dotnet run --configuration Release
验证应用程序按预期工作后,可以停止本地服务器并继续创建 Dockerfile,以便可以将应用部署到容器应用。
在 MyAcaDemo 文件夹中,创建名为
Dockerfile
的文件并添加以下内容。FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY . . RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app COPY --from=build /app/publish . EXPOSE 8080 ENTRYPOINT ["dotnet", "MyAcaDemo.dll"]
现在你已经准备好代码和 Dockerfile,可以将应用部署到 Azure 容器应用。
创建 Azure 资源
使用以下命令从 CLI 登录到 Azure。 若要完成身份验证过程,请确保遵循所有提示。
az login
安装或更新 Azure CLI 的 Azure 容器应用扩展。
az extension add --name containerapp --upgrade
注意
如果运行
az containerapp
命令时收到有关缺少参数的错误,请确保已安装最新版本的 Azure 容器应用扩展。现在你已完成 Azure CLI 设置,可以定义一组环境变量。
在运行以下命令之前,请查看提供的值。
位置配置为“美国中部”,但如果你愿意,可以更改为离你最近的位置。
LOCATION="CentralUS" RESOURCE_GROUP="my-demo-group" IDENTITY_NAME="my-demo-identity" ENVIRONMENT="my-demo-environment" REGISTRY_NAME="mydemoregistry$(openssl rand -hex 4)" CONTAINER_APP_NAME="my-demo-app"
mydemoregistry$(openssl rand -hex 4)
命令生成一个随机字符串,用作容器注册表名称。 注册表名称必须全局唯一,因此此字符串有助于确保命令成功运行。创建一个资源组来组织与你的容器应用部署相关的服务。
az group create \ --name $RESOURCE_GROUP \ --___location $LOCATION \ --output none
创建用户分配的托管标识,并使用以下命令获取其 ID。
首先,创建托管标识。
az identity create \ --name $IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --output none
现在,将标识标识符设置为变量以供以后使用。
IDENTITY_ID=$(az identity show \ --name $IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
使用以下命令创建容器应用环境来托管应用。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --___location $LOCATION \ --mi-user-assigned $IDENTITY_ID \ --output none
在资源组中创建 Azure 容器注册表 (ACR) 实例。 注册表存储容器映像。
az acr create \ --resource-group $RESOURCE_GROUP \ --name $REGISTRY_NAME \ --sku Basic \ --output none
使用以下命令将用户分配的托管标识分配给容器注册表实例。
az acr identity assign \ --identities $IDENTITY_ID \ --name $REGISTRY_NAME \ --resource-group $RESOURCE_GROUP \ --output none
生成映像并将其推送到注册表
使用以下命令生成容器映像并将其推送到容器注册表实例。
az acr build \
-t $REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" \
-r $REGISTRY_NAME .
此命令将标记 helloworld
应用到容器映像。
创建容器应用
使用以下命令创建容器应用。
az containerapp create \
--name $CONTAINER_APP_NAME \
--resource-group $RESOURCE_GROUP \
--environment $ENVIRONMENT \
--image $REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" \
--target-port 8080 \
--ingress external \
--user-assigned $IDENTITY_ID \
--registry-identity $IDENTITY_ID \
--registry-server $REGISTRY_NAME.azurecr.io \
--query properties.configuration.ingress.fqdn
此命令会将 acrPull
角色添加到用户分配的托管标识,使其能够从容器注册表中提取映像。
下表描述了此命令使用的参数。
参数 | 价值 | 说明 |
---|---|---|
name |
$CONTAINER_APP_NAME |
容器应用的名称。 |
resource-group |
$RESOURCE_GROUP |
部署容器应用的资源组。 |
environment |
$ENVIRONMENT |
运行容器应用的环境。 |
image |
$REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" |
要部署的容器映像,包括注册表名称和标记。 |
target-port |
80 |
匹配应用侦听请求的端口。 |
ingress |
external |
使容器应用可从公共 Internet 访问。 |
user-assigned |
$IDENTITY_ID |
容器应用的用户分配的托管标识。 |
registry-identity |
registry-identity |
用于访问容器注册表的标识。 |
registry-server |
$REGISTRY_NAME.azurecr.io |
容器注册表的服务器地址。 |
query |
properties.configuration.ingress.fqdn |
将输出筛选为仅应用的完全限定的域名 (FQDN)。 |
此命令完成后,它将返回新 Web 应用的 URL。
验证部署
将应用的 URL 复制到 Web 浏览器中。 容器应用启动后,它将返回“Hello World!”。
由于这是首次访问该应用程序,应用程序可能需要一些时间才能返回响应。
清理资源
如果不打算使用本教程中创建的 Azure 资源,可以使用一个命令将其删除。 在运行命令之前,本教程系列的下一步将展示如何更改代码并更新 Azure 中的应用。
如果你已完成操作并且想要删除本教程中创建的所有 Azure 资源,请使用以下命令删除资源组。
az group delete --name aca-demo
提示
遇到问题? 在 Azure 容器应用存储库中提交问题,告知我们有关 GitHub 的信息。
后续步骤
接下来,继续了解如何更新创建的容器应用。