将辅助角色服务部署到 Azure

本文介绍如何将 .NET 辅助角色服务部署到 Azure。 当您的工作负载以Azure 容器实例(ACI)形式从Azure 容器注册表(ACR)运行时,它可以在云中作为一个微服务。 长时间运行的服务有许多用例,而后台服务正是为此而存在。

本教程中,您将学习如何:

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

小窍门

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

先决条件

创建新项目

若要使用 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 worker

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

dotnet new worker --name <Project.Name>

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

生成应用程序以确保它还原依赖包,并编译时不会出现错误。

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

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

dotnet build

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

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

dotnet build <path/to/project.csproj>

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

添加 Docker 支持

如果您在创建新的工作项目时正确选择了启用 Docker复选框,请跳到生成 Docker 映像步骤。

如果未选择此选项,则无需担心,仍可立即添加此选项。 在 Visual Studio 中,右键单击解决方案资源管理器中的项目节点,然后选择“添加>Docker 支持”。 系统会提示你选择 目标 OS;选择“ 确定 ”并选择默认 OS。

Docker 文件选项

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

Docker 支持需要 Dockerfile。 此文件是一套详细的说明,帮助您将 .NET Worker Service 构建成 Docker 映像。 Dockerfile一个没有文件扩展名的文件。 以下代码是 Dockerfile 示例,应存在于项目文件的根目录中。

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

FROM mcr.microsoft.com/dotnet/runtime:8.0@sha256:e6b552fd7a0302e4db30661b16537f7efcdc0b67790a47dbf67a5e798582d3a5 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@sha256:35792ea4ad1db051981f62b313f1be3b46b1f45cadbaa3c288cd0d3056eefb83 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"]

注释

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

有关官方 .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:latestDocker 任务的输出终端显示并报告 Docker 构建命令的进度。

注释

如果没有提示您标记图像,那么 Visual Studio Code 可能依赖现有的 tasks.json 文件。 如果使用的标记不合适,可以通过更新docker-build数组中dockerBuild/tag配置项的tasks值来更改标记。 请考虑以下示例配置部分:

{
  "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:发布对话框 - 选择 Azure

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

Visual Studio:发布对话框 - 选择容器注册表

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

Visual Studio:发布对话框 - 选择容器注册表详细信息

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

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

Visual Studio Code:Docker - 推送映像

集成终端窗口将命令的 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 文件。
  • docker build针对 Dockerfile 在容器注册表资源中运行命令。
  • 将映像添加到容器注册表。

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

部署为容器实例

从 Visual Studio Code 中,从活动栏中选择 Docker。 展开 REGISTRIES 节点,然后选择“ 连接注册表”。 出现提示时选择 Azure ,并在必要时登录。

重要

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

Visual Studio Code - Docker:连接注册表

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

Visual Studio Code - Docker:将映像部署到 Azure 容器实例

若要创建容器实例,请先使用 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 门户:正在运行的容器实例

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

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

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

提供适当的值:

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

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

另请参阅