在本文中,您將學習如何將 .NET Worker Service 部署至 Azure。 當您的 Worker 以 Azure 容器執行個體 (ACI) 在 Azure 容器登錄 (ACR) 中運行時,它可以作為雲端中的微服務。 長時間執行的服務有許多使用案例,而 Worker Service 就是因為這個原因而存在。
在本教學課程中,您將瞭解如何:
- 建立背景工作服務。
- 建立容器登錄資源。
- 將映像推送至容器登錄。
- 部署為容器執行個體。
- 驗證工作服務功能。
小提示
所有「.NET 工作員」範例原始程式碼都可以從 範例瀏覽器 下載。 如需詳細資訊,請參閱 瀏覽程式碼範例:在 .NET 中的工作者。
先決條件
- .NET 5.0 SDK 或更新版本。
- Docker 桌面(Windows 或 Mac)。
- 具有有效訂閱的 Azure 帳戶。 免費建立帳戶。
- 視您選擇的開發人員環境而定:
建立新專案
若要使用 Visual Studio 建立新的背景工作角色服務專案,請選取 [ 檔案>新增>專案...]。從 [建立新專案 ] 對話方塊中,搜尋 [背景工作角色服務],然後選取 [背景工作角色服務範本]。 輸入所需的專案名稱,選取適當的位置,然後選取 下一步。 在 其他資訊 頁面上,針對 目標架構.NET 5.0選取 ,然後核取 啟用 Docker 選項以啟用 Docker 支援。 選取所需的 Docker 作業系統。
若要使用 Visual Studio Code 建立新的工作者服務專案,您可以從整合式終端機執行 .NET CLI 命令。 如需詳細資訊,請參閱 Visual Studio Code:整合式終端機。
開啟整合終端機,執行 dotnet new 命令,並將 <Project.Name> 替換成您想要的專案名稱。
dotnet new worker --name <Project.Name>
如需 .NET CLI 新建 Worker Service 專案命令的詳細資訊,請參閱 dotnet new worker。
若要使用 .NET CLI 創建新的 Worker Service 專案,請在工作目錄中開啟您常用的終端機。 執行 dotnet new 命令,並將 <Project.Name> 替換為您想要的專案名稱。
dotnet new worker --name <Project.Name>
如需 .NET CLI 中的 "new worker" 指令有關「工作服務專案」命令的詳細資訊,請參閱 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 支援
如果您在建立新的 Worker 專案時正確選取 [ 啟用 Docker ] 核取方塊,請跳至建 置 Docker 映像 檔步驟。
如果您沒有選擇此選項,請不要擔心,您現在仍然可以添加它。 在 Visual Studio 中,以滑鼠右鍵按一下 [方案總管] 中的專案節點,然後選取 [新增>Docker 支援]。 系統會提示您選取 目標作業系統;選取 [ 確定 ] 並選取預設作業系統。
在 Visual Studio Code 中,您需要安裝 Docker 延伸模組 和 Azure 帳戶延伸模組 。 開啟命令面板,然後選取 Docker:將 Docker 檔案新增至工作區 選項。 如果系統提示您選取 應用程式平台,請選擇 .NET:核心主控台。 如果系統提示您 選取專案,請選擇您建立的 Worker Service 專案。 當提示您 選取作業系統時,請選擇第一個列出的作業系統。 當系統提示是否 包含選用的 Docker Compose 檔案時,請選取 [否]。
Docker 支援需要 Dockerfile。 此檔案是一組完整的指示,用來將 .NET Worker 服務建置為 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"]
備註
您需要更新 Dockerfile 中參考 *App.CloudService 的多個行,並將這些行替換成您專案的名稱。
如需官方 .NET 映像的詳細資訊,請參閱 Docker Hub:.NET 執行階段 和 Docker Hub:.NET SDK。
建置 Docker 映像
若要建置 Docker 映像檔,Docker 引擎必須執行。
這很重要
使用 Docker Desktop 和 Visual Studio 時,若要避免 與磁碟區共用相關的錯誤,請確定已啟用磁碟區共用。
- 在 Docker Desktop 的 [設定] 畫面上,選取 [共用磁碟機]。
- 選取包含專案檔案的磁碟機。
如需詳細資訊,請參閱 使用 Docker 進行 Visual Studio 開發疑難排解。
以滑鼠右鍵按一下 [方案總管] 中的 Dockerfile,然後選取 [建置 Docker 映像]。 「 輸出」 視窗隨即顯示,報告 docker build 指令進度。
在檔案總管中的 Dockerfile 上按一下滑鼠右鍵,然後選取 [建置映像]。 當系統提示標示影像為時,請輸入appcloudservice:latest。 Docker Task 輸出終端隨即顯示,報告 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 Container Registry (ACR) 資源可讓您在私人登錄中建置、儲存及管理容器映像和成品。 若要建立容器登錄,您必須在 Azure 入口網站中 建立新的資源 。
- 選取 訂用帳戶和對應 的資源群組 (或建立新的資源群組)。
- 輸入 登錄名稱。
- 選取 位置。
- 選取適當的 SKU,例如 [基本]。
- 選擇 檢閱 + 創建。
- 看到驗證通過後,選取建立。
這很重要
若要在建立容器執行個體時使用此容器登錄,您必須啟用 管理員使用者。 選取 [存取金鑰],然後啟用 [管理員使用者]。
Azure Container Registry (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 Container Registry,並指定登錄名稱。
- 已啟用管理員帳戶,這是使用 Azure 容器執行個體所需的條件。
如需詳細資訊,請參閱 快速入門:建立 Azure 容器登錄。
將映像推送至容器登錄
建置 .NET Docker 映像並建立容器登錄資源後,您現在可以將映像推送至容器登錄。
以滑鼠右鍵按一下 [方案總管] 中的專案,然後選取 [發佈]。 「 發佈」 對話方塊隨即顯示。 針對 目標,選取 Azure,然後選取 下一步。
針對 [特定目標],選取 [Azure 容器登錄 ],然後選取 [ 下一步]。
接下來,針對 Container Registry,選取您用來建立 ACR 資源的 訂用帳戶名稱 。 從 [容器登錄] 選取區域中,選取您建立的容器登錄,然後選取 [完成]。
這會建立發佈設定檔,可用來將映像發佈至容器登錄。 選取 [發佈] 按鈕,將映像推送至容器登錄, [輸出] 視窗會報告發佈進度,當它成功完成時,您會看到「已成功發佈」訊息。
從 Visual Studio Code 的 [活動列] 中選取 [Docker]。 展開 IMAGES 樹狀結構檢視面板,展開 appcloudservice 影像節點,然後在 latest 標籤上按一下滑鼠右鍵。
整合式終端機視窗會將指令的 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執行命令。 - 將映像檔新增至容器登錄。
若要確認映像已成功推送至容器登錄,請流覽至 Azure 入口網站。 開啟容器登錄資源,在 [服務] 底下,選取 [ 存放庫]。 您應該看到圖像。
部署為容器執行個體
從 Visual Studio Code 中,從 [活動列] 選取 [Docker]。 展開 REGISTRIES 節點,然後選取 Connect Registry。 出現提示時選取 [Azure ],並視需要登入。
這很重要
從 Visual Studio Code 部署為容器執行個體已無法在 Mac 上使用。 如需詳細資訊,請參閱 GitHub:關於 Visual Studio Code 的 Docker 延伸模組。
展開 REGISTRIES 節點,選取 Azure、您的訂用帳戶>、容器登錄>、映像,然後以滑鼠右鍵按一下該標籤。 選取 [將映像部署至 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 入口網站 中 建立新的資源 。
- 選取上一節中的相同 訂用帳戶和對應 的資源群組 。
- 輸入 容器名稱—
appcloudservice-container。 - 選取區域,使之與先前的位置選取相對應。
- 針對 映像來源,選取 Azure Container Registry。
- 依據上一步驟提供的名稱選取 註冊表 。
- 選取 影像 和 影像 標籤。
- 選擇 檢閱 + 創建。
- 假設驗證已通過,請選取 [建立]。
建立資源可能需要一些時間,建立資源後,請選取 [ 移至資源 ] 按鈕。
如需詳細資訊,請參閱 快速入門:建立 Azure 容器執行個體。
驗證服務功能
建立容器執行個體之後,它會立即開始執行。
若要確認背景工作服務是否正常運作,請流覽至容器執行個體資源中的 Azure 入口網站,選取 [容器] 選項。
您會看到容器及其目前 狀態。 在此情況下,是 Running。 選取 記錄以查看 .NET 背景服務輸出。
若要驗證背景工作者服務是否正常運作,您可以檢視執行中應用程式的日誌。 使用 az container logs 命令:
az container logs -g <resource group> --name <instance name>
提供適當的值:
-
<resource group>:您在本教學課程中使用的資源群組名稱。 -
<instance name>:容器執行個體的名稱。
您會看到 .NET 工作服務輸出日誌,這表示您已成功將容器化應用程式部署至 ACI。
另請參閱
- .NET 中的背景工作服務
- 在
BackgroundService中使用範圍服務 -
使用
BackgroundService創建 Windows 服務 -
實作
IHostedService介面 - 教學課程:容器化 .NET Core 應用程式