Azure App Service 比較容器化的部署方式

2022-03-27

說明如何使用 Visual Studio 將 .NET Core Application 以 Container 的方式部署至 Azure App Service,同時也比較如何將相同的專案進行調整,並直接部署至 App Service 而不透過 Container 的方式,從而比較兩者的差異。

logo

說明

建立專案

建立專案,因為要使用 .NET Framework 進行容器化的部署需要 Windows Container,必須要有 Windows Professional Edition 所支援的 Hyper-V 功能 (My Workstation is Home Edition 😥),因此選擇可以跨平台使用 Linux Container 方式的 .NET Core 進行本次的專案類型。

在新增專案時使用 「啟用 Docker」 ,專案會自動增加 Dockerfile 以及安裝相關的 Pacakges,同時也可以在開發環境使用 Docker Container 進行測試,會需要連動到 Docker Desktop,而如何安裝 Docker Desktop 可以參考 Docker Tutorial

<PackageReference 
  Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" 
  Version="1.14.0" />

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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

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

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

發佈至 App Service 使用 Container 的方式

如果要使用 Contaniner 的方式,必須要透過 Azure Container Registry 用以 Build Image 以及 負責保存 Image,而如果使用 Visual Studio 的發佈 GUI,會引導開發者新增 App Service 以及 Azure Container Registry 資源。


建立 App Service
建立 Azure Contianer Registry, ACR

使用 Container 的部署方式,因為要先發佈至 Azure Container Registry 再接著編譯為 Image 後部署至 App Service,整個進行的過程會比較長,大約 5 分鐘左右。

部署至 ACR 的過程

在本機上可以使用 Dcoker 的方式測試專案,也可以使用 Console 或者 IIS Express 的方式,如果用 Docker 就不能享受到 Hot Reload 的好處,因此每次編譯都需要重新啟動 Docker Image ,所以使用 Console 或者 IIS Express 會比較方便。但如果有隔離環境的需求 (例如使用特定版本的相依程式),則使用 Container 的方式測試會是不錯的 (或是唯一的) 選擇 😄

項目 用途
CoreMVC_Image 專案同名的項目,使用 Console 的方式測試
IIS Express 使用 IIS Express 的方式測試
Docker 使用 Docker 的方式測試
WSL 使用 Windows Subsystem for Linux 的方式測試

發佈至 App Service

原本的所建立的專案,如果有勾選 「啟用 Docker」,若要直接部署至 App Service 但不採用 Container 的方式,會發生錯誤。

這個時候可以藉由 Nuget 管理,移除掉 "Microsoft.VisualStudio.Azure.Containers.Tools.Targets,再次進行發佈就沒有問題囉。

記得這個步驟進行前可以先進行版控,除了可以恢復操作外,也可以比較移除 Package 前後的差別。

直接發佈至 App Service 的速度很快 (30 秒以內),馬上就可以到網站上驗證成果。

只需要選擇 App Service