使用Visual Studio開發支援容器化的 .net 網站

在 .net 開發技術中,若要產生支援 Linux Container 的 Image 非常容易,你只需要底下幾個步驟即可:

圖片

上圖中的 Image Registry,可以是私有的,也可以是公用的。目前坊間公用的 Registry 典型像是 Docker Hub,若你把Image上傳到Docker Hub,人人都可以下載使用。許多軟體和框架的開發商,都已經把自己所建立的SDK, Runtime上傳至Docker Hub:
圖片

私有的Registry則適合企業存放僅供內部使用的Image。開發人員可以透過軟體自建Private Image Registry,或是採用雲端現成的服務,像是Azure 上的ACR(Azure Container Registry)。

使用Docker File建立image

docker file是一份文件,透過docker file我們可以建置出docker image,你可以透過手動方式,以docker CLI來建立,若採用開發工具,在 Visual Studio 中,只需要將專案加入docker支援,即可自動建立 docker file:

圖片

Visual Studio自動建立出來的 docker file,會依照 .net 版本有所不同。例如,底下是 .net 5 的 docker file:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

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

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

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

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

建立的過程中,如果出現OS選擇,請選擇 linux:
圖片

上面的 docker file 被稱為 multi-stage build, 主要分成四個段落。有了docker file之後,我們就可以將我們開發出來的網站,建立出Image了。

使用Visual Studio建立並發佈Image

你可以在 Visual Studio中,直接透過方案總管來建置 Image 影像檔,完成後,該應用程式的image檔案會出現在 local 的 docker desktop工具中:

完成後,即可建立出image

注意,你的Visual Studio環境必須安裝有 docker desktop才行。

前面提到過,建立出來的Image,可以先發佈到 Image Registry,以便於未來將應用程式佈署到正式環境執行。

你可以透過 docker push 指令,把Image推送到Registry,不過我們有Visual Studio,可以更方便的完成這個動作。

你可以先在Azure Portal建立好私有(Privately)的Registry,建立方式如下:

接著,我們可以透過Visual Studio直接把Image建置好並發佈到Azure ACR,過程如下:

從ACR佈署到ACI

將建立好的Image放上 ACR,同時也有另一個好處,就是我們保留了每一個不同時期產出的網站,就好比把一個個的不同版本的artifacts封存,我們可以藉由ACR,進行每一個可運行的網站的版本控管。

除了隨時將最新版的部屬到正式機環境執行,我們也隨時可以進行roll-back退回上一版,甚至隨時找到任何一個需要的版本。

若您想將發佈到ACR上的image,實際上佈署到容器中運行,可以參可底下做法,下面展示將ACR發佈到ACI,成為一個實際可執行的網站:

留言

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

在POC或迷你專案中使用 LiteDB

專業的價值...

精彩(且驚人)的Semantic Kernel入門範例

周末讀書會 - 一如既往