你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:从源代码生成并部署到 Azure 容器应用

本文介绍如何使用你偏好的编程语言,从计算机上的源代码生成应用程序并将其部署到 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. 
  1. 创建并运行源代码。

    创建新 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,以便可以将应用部署到容器应用。

  2. 在 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 资源

  1. 使用以下命令从 CLI 登录到 Azure。 若要完成身份验证过程,请确保遵循所有提示。

    az login
    
  2. 安装或更新 Azure CLI 的 Azure 容器应用扩展。

    az extension add --name containerapp --upgrade
    

    注意

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

  3. 现在你已完成 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) 命令生成一个随机字符串,用作容器注册表名称。 注册表名称必须全局唯一,因此此字符串有助于确保命令成功运行。

  4. 创建一个资源组来组织与你的容器应用部署相关的服务。

    az group create \
      --name $RESOURCE_GROUP \
      --___location $LOCATION \
      --output none
    
  5. 创建用户分配的托管标识,并使用以下命令获取其 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)
    
  6. 使用以下命令创建容器应用环境来托管应用。

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --___location $LOCATION \
        --mi-user-assigned $IDENTITY_ID \
        --output none
    
  7. 在资源组中创建 Azure 容器注册表 (ACR) 实例。 注册表存储容器映像。

    az acr create \
      --resource-group $RESOURCE_GROUP \
      --name $REGISTRY_NAME \
      --sku Basic \
      --output none
    
  8. 使用以下命令将用户分配的托管标识分配给容器注册表实例。

    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 的信息。

后续步骤

接下来,继续了解如何更新创建的容器应用。