Azure App Service 比較容器化的部署方式
2022-03-27
說明如何使用 Visual Studio 將 .NET Core Application 以 Container 的方式部署至 Azure App Service,同時也比較如何將相同的專案進行調整,並直接部署至 App Service 而不透過 Container 的方式,從而比較兩者的差異。
說明
建立專案
建立專案,因為要使用 .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 /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 資源。
使用 Container 的部署方式,因為要先發佈至 Azure Container Registry 再接著編譯為 Image 後部署至 App Service,整個進行的過程會比較長,大約 5 分鐘左右。
在本機上可以使用 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 秒以內),馬上就可以到網站上驗證成果。