将辅助角色服务部署到 Azure

本文介绍如何将 .NET 辅助角色服务部署到 Azure。 当辅助角色作为 Azure 容器注册表 (ACR) 中的 Azure 容器实例 (ACI) 运行时,它可以充当云中的微服务。 长时间运行的服务有许多用例,这正是使用辅助角色服务的原因。

在本教程中,你将了解如何执行以下操作:

  • 创建辅助角色服务。
  • 创建容器注册表资源。
  • 将映像推送到容器注册表。
  • 作为容器实例部署。
  • 验证辅助角色服务功能。

提示

所有“.NET 中的辅助角色”示例源代码都可以在示例浏览器中下载。 有关详细信息,请参阅浏览代码示例:.NET 中的辅助角色

先决条件

创建新项目

若要使用 Visual Studio 创建新的辅助角色服务项目,请选择“文件”>“新建”>“项目...” 。从“创建新项目”对话框搜索“辅助角色服务”,并选择辅助角色服务模板。 输入所需的项目名称,选择相应的位置,然后选择“下一步”。 在“其他信息”页上,对于“目标框架”,请选择 .NET 5.0,并选中“启用 Docker”选项以启用 Docker 支持。 选择所需的 Docker OS。

若要使用 Visual Studio Code 创建新的辅助角色服务项目,可以从集成终端运行 .NET CLI 命令。 有关详细信息,请参阅 Visual Studio Code:集成终端

打开集成终端并运行 dotnet new 命令,将 <Project.Name> 替换为所需的项目名称。

dotnet new worker --name <Project.Name>

有关 .NET CLI 新建辅助角色服务项目命令的详细信息,请参阅 dotnet new 辅助角色

若要使用 .NET CLI 创建新的辅助角色服务项目,请在工作目录中打开你最喜欢的终端。 运行 dotnet new 命令,将 <Project.Name> 替换为所需的项目名称。

dotnet new worker --name <Project.Name>

有关 .NET CLI 新建辅助角色服务项目命令的详细信息,请参阅 dotnet new 辅助角色

构建应用程序以确保它还原依赖包,并且编译时不会出错。

若要从 Visual Studio 生成应用程序,请选择 F6 或选择“生成”>“生成解决方案”菜单选项。

若要从 Visual Studio Code 生成应用程序,请打开集成终端窗口,然后从工作目录运行 dotnet build 命令。

dotnet build

有关 .NET CLI build 命令的详细信息,请参阅 dotnet build

若要从 .NET CLI 生成应用程序,请从工作目录运行 dotnet build 命令。

dotnet build <path/to/project.csproj>

指定 <path/to/project.csproj> 值,该值是要生成的项目文件的路径。 有关 .NET CLI build 命令的详细信息,请参阅 dotnet build

添加 Docker 支持

如果在创建新的 Worker 项目时正确选择了“启用 Docker”复选框,请跳至生成 Docker 映像步骤。

如果未选择此选项,不用担心,你现在仍然可以添加它。 在 Visual Studio 中,右键单击“解决方案资源管理器”中的项目节点,然后选择“添加”>“Docker 支持”。 系统将提示你选择“目标 OS”,选择“确定”使用默认 OS。

Docker File Options

在 Visual Studio Code 中,需要安装 Docker 扩展Azure 帐户扩展。 打开命令面板,选择“Docker: 将 Docker 文件添加到工作区”选项。 当系统提示“选择应用程序平台”时,请选择“.NET: Core 控制台”。 当系统提示“选择项目”时,请选择你创建的辅助角色服务项目。 当系统提示“选择操作系统”时,选择列出的第一个操作系统。 当系统提示是否“包括可选 Docker Compose 文件”时,请选择“否” 。

Docker 支持需要 Dockerfile。 此文件是一整套指令,用于将 .NET 辅助角色服务生成为 Docker 映像。 Dockerfile 是一个没有文件扩展名的文件。 下面的代码是一个 Dockerfile 示例,应存在于项目文件的根目录中。

使用 CLI,Dockerfile 不是为你创建的。 将其内容复制到项目根目录中名为“Dockerfile”的新文件中

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["App.CloudService.csproj", "./"]
RUN dotnet restore "App.CloudService.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "App.CloudService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "App.CloudService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.CloudService.dll"]

注意

需要更新 Dockerfile 中引用 *App.CloudService(将其替换为项目名称)的各行。

有关官方 .NET 映像的详细信息,请参阅 Docker Hub:.NET 运行时Docker Hub:.NET SDK

生成 Docker 映像

若要生成 Docker 映像,Docker 引擎必须运行。

重要

使用 Docker Desktop 和 Visual Studio 时,若要避免与卷共享相关的错误,请确保已启用该功能。

  1. 在 Docker Desktop 中的“设置”屏幕上,选择“共享驱动器”。
  2. 选择包含项目文件的驱动器。

有关详细信息,请参阅使用 Docker 排查 Visual Studio 开发方面的问题

右键单击解决方案资源管理器中的“Dockerfile”,然后选择“生成 Docker 映像”。 此时将显示“输出”窗口,用于报告 docker build 命令进度。

右键单击资源管理器中的“Dockerfile”,然后选择“生成映像”。 当系统提示“将映像标记为”时,请输入 appcloudservice:latest。 此时将显示“Docker 任务”输出终端,用于报告 Docker 生成命令进度。

注意

如果系统未提示标记映像,则可能是 Visual Studio Code 依赖于现有的 tasks.json。 如果使用的不是所需标记,可以对其进行更改,方法是更新 tasks 数组中 docker-build 配置项的 dockerBuild/tag 值。 请考虑以下示例配置部分:

{
  "type": "docker-build",
  "label": "docker-build: release",
  "dependsOn": [
    "build"
  ],
  "dockerBuild": {
    "tag": "appcloudservice:latest",
    "dockerfile": "${workspaceFolder}/cloud-service/Dockerfile",
    "context": "${workspaceFolder}",
    "pull": true
  },
  "netCore": {
    "appProject": "${workspaceFolder}/cloud-service/App.CloudService.csproj"
  }
}

在 Dockerfile 的根目录中打开终端窗口,并运行以下 docker 命令:

docker build -t appcloudservice:latest -f Dockerfile .

docker build 命令运行时,它会将 Dockerfile 中的每一行处理为一个指令步骤。 此命令生成映像,并创建一个指向该映像的本地存储库“appcloudservice”。

提示

生成的 Dockerfile 因开发环境不同而不同。 例如,如果从 Visual Studio 中添加 Docker 支持,则在尝试从 Visual Studio Code 生成 Docker 映像时可能会遇到问题,因为 Dockerfile 步骤有所不同。 最好选择一个开发环境并在本教程中始终使用该环境。

创建容器注册表

利用 Azure 容器注册表 (ACR) 资源,你可以在专用注册表中生成、存储和管理容器映像与项目。 若要创建容器注册表,需要在 Azure 门户中创建一个新资源

  1. 选择“订阅”和相应的“资源组”(或创建一个新资源组)。
  2. 输入注册表名称。
  3. 选择“位置” 。
  4. 选择适当的 SKU,例如“基本”。
  5. 选择“查看 + 创建”。
  6. 系统显示“验证已通过”后,选择“创建”。

重要

若要在创建容器实例时使用此容器注册表,必须启用“管理员用户”。 选择“访问密钥”,然后启用“管理员用户”。

利用 Azure 容器注册表 (ACR) 资源,你可以在专用注册表中生成、存储和管理容器映像与项目。 在 Dockerfile 的根目录中打开终端窗口,并运行以下 Azure CLI 命令:

重要

要从 Azure CLI 与 Azure 资源交互,必须对终端会话进行身份验证。 若要进行身份验证,请使用 az login 命令:

az login

登录后,如果具有多个订阅且未设置默认订阅,请使用 az account set 命令指定你的订阅。

az account set --subscription <subscription name or id>

登录到 Azure CLI 后,会话可以相应地与资源进行交互。

如果还没有想要用于与工作器服务进行关联的资源组,请使用 az group create 命令创建一个:

az group create -n <resource group> -l <location>

提供 <resource group> 名称和 <location>。 若要创建容器注册表,请调用 az acr create 命令。

az acr create -n <registry name> -g <resource group> --sku <sku> --admin-enabled true

将占位符替换为自己的适当值:

  • <registry name>:注册表的名称。
  • <resource group>:使用的资源组名称。
  • <sku>:接受的值、基本、经典、高级或标准。

上述命令:

  • 在指定的资源组中创建一个给定了注册表名称的 Azure 容器注册表。
  • 已启用管理员用户,这是 Azure 容器实例所必需的。

有关详细信息,请参阅快速入门:创建 Azure 容器注册表

将映像推送到容器注册表

生成 .NET Docker 映像并创建容器注册表资源后,现在就可以将映像推送到容器注册表。

在解决方案资源管理器中,右键单击该项目并选择“发布”。 此时会显示“发布”对话框。 对于“目标”,选择“Azure”,然后选择“下一步”。

Visual Studio: Publish dialog - select Azure

对于“特定目标”,选择“Azure 容器注册表”,然后选择“下一步”。

Visual Studio: Publish dialog - select container registry

接下来,对于“容器注册表”,选择曾用于创建 ACR 资源的“订阅名称”。 在“容器注册表”选择区域,选择创建的容器注册表,然后选择“完成”。

Visual Studio: Publish dialog - select container registry details

该操作会创建一个发布配置文件,可用于将映像发布到容器注册表。 选择“发布”按钮将映像推送到容器注册表,“输出”窗口将报告发布进度,操作成功完成后,将显示“已成功发布”的消息。

从 Visual Studio Code 中的“活动栏”中选择“Docker” 。 展开“图像”树状视图,然后展开 appcloudservice 映像节点并右键单击 latest 标记。

Visual Studio Code: Docker - push image

集成终端窗口将向容器注册表报告 docker push 命令的进度。

若要将映像推送到容器注册表,需要先登录注册表:

az acr login -n <registry name>

az acr login 命令将通过 Docker CLI 登录到容器注册表。 若要将映像推送到容器注册表,请使用 az acr build 命令,容器注册表名称为 <registry name>

az acr build -r <registry name> -t appcloudservice .

上述命令:

  • 将源打包到 tar 文件。
  • 将其上传到容器注册表。
  • 容器注册表将解压缩 tar 文件。
  • 在容器注册表资源中对 Dockerfile 运行 docker build 命令。
  • 将映像添加到容器注册表。

若要验证映像是否已成功推送到容器注册表,请导航到 Azure 门户。 打开容器注册表资源,选择“服务”下的“存储库”。 你应该会看到该映像。

作为容器实例部署

从 Visual Studio Code 中的“活动栏”中选择“Docker” 。 展开“注册表”节点,再选择“连接注册表”。 当系统提示时,选择“Azure”并登录(如果需要)。

重要

从 Visual Studio Code 部署为容器实例不再适用于 Mac。 有关详细信息,请参阅 GitHub:关于 Visual Studio Code 的 Docker 扩展

Visual Studio Code - Docker: Connect registry

展开“注册表”节点,选择“Azure”,再选择“订阅”>“容器注册表”>“映像”,然后右键单击标记。 选择“将映像部署到 Azure 容器实例”。

Visual Studio Code - Docker: Deploy image to Azure Container Instances

若要创建容器实例,请先使用 az container create 命令创建容器组。

az container create -g <resource group> \
  --name <instance name> \
  --image <registry name>.azurecr.io/<image name>:latest \
  --registry-password <password>

请提供适当的值:

  • <resource group>:在本教程中使用的资源组名称。
  • <instance name>:容器实例的名称。
  • <registry name>:容器注册表的名称。
  • <image name>:映像的名称。
  • <password>:容器注册表的密码,可以从 Azure 门户的容器注册表资源 >“访问密钥”获取此密码。

若要创建容器实例,还需要在 Azure 门户中创建一个新资源

  1. 选择与上一部分相同的“订阅”和相应的“资源组”。
  2. 输入容器名称 - appcloudservice-container
  3. 选择与上一个“位置”选择相对应的“区域” 。
  4. 对于映像源,选择“Azure 容器注册表”。
  5. 按上一步骤中提供的名称选择“注册表”。
  6. 选择“映像”和“映像标记” 。
  7. 选择“查看 + 创建”。
  8. 假定“验证已通过”,选择“创建”。

创建资源可能需要一些时间,一旦创建,请选择“转到资源”按钮。

有关详细信息,请参阅快速入门:创建 Azure 容器实例

验证服务功能

容器实例创建后,它会立即开始运行。

若要验证辅助角色服务是否正常运行,请导航到容器实例资源中的 Azure 门户,选择“容器”选项。

Azure portal: Container instance running

你将看到容器及其当前状态。 在本例中,其状态为“正在运行”。 选择“日志”查看 .NET 辅助角色服务输出。

若要验证辅助角色服务是否正常运行,可以查看正在运行的应用程序的日志。 使用 az container logs 命令:

az container logs -g <resource group> --name <instance name>

请提供适当的值:

  • <resource group>:在本教程中使用的资源组名称。
  • <instance name>:容器实例的名称。

将看到 .NET 辅助角色服务输出日志,这意味着已成功将容器化应用部署到 ACI。

另请参阅