容器化 .NET Core 應用程式

適用于:Windows Server 2022、Windows Server 2019、Windows Server 2016

本主題說明如何在設定環境之後,將現有的範例 .NET 應用程式封裝以作為 Windows 容器進行部署,如開始使用:準備適用於容器的 Windows 中所述,然後執行您的第一個容器,如執行您的第一個 Windows 容器中所述。

您也需要在您的電腦上安裝 Git 原始檔控制系統。 若要安裝,請造訪 Git

從 GitHub 複製範例程式碼

所有容器範例原始程式碼都會保留在 Virtualization-Documentation git 存放庫 (先前稱為存放庫) 底下名為 windows-container-samples 的資料夾中。

  1. 開啟 PowerShell 工作階段,並將目錄變更為您要儲存此存放庫的資料夾。 (其他命令提示字元視窗類型也可以運作,但我們的範例命令會使用 PowerShell。)

  2. 將存放庫複製到您目前的工作目錄:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. 瀏覽至在 Virtualization-Documentation\windows-container-samples\asp-net-getting-started 底下找到的範例目錄,並使用下列命令建立 Dockerfile。

    Dockerfile 就像 makefile 一樣,它是指示容器引擎如何建立容器映像的指令清單。

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

寫入 Dockerfile

使用您偏好的任何文字編輯器來開啟您剛才建立的 Dockerfile,然後新增下列內容:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

讓我們逐行細分,並說明每個指令的作用。

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

第一組程式碼行會宣告我們將使用哪個基本映像做為建置容器的基礎。 如果本機系統原本沒有這個映像,則 Docker 將自動嘗試擷取該映像。 mcr.microsoft.com/dotnet/core/sdk:2.1 隨附於已安裝的 .NET core 2.1 SDK 中,因此取決於以 2.1 版為目標的 ASP .NET core 專案建置工作。 下一個指令會將容器中的工作目錄變更為 /app ,因此在此內容下執行此命令之後的所有命令。

COPY *.csproj ./
RUN dotnet restore

接下來,這些指令會將 .csproj 檔案複製到 build-env 容器的 /app 目錄中。 複製這個檔案之後,.NET 將讀取其內容,然後開始擷取專案所需的所有相依性和工具。

COPY . ./
RUN dotnet publish -c Release -o out

.NET 將所有相依性提取到 build-env 容器之後,下一個指令會將所有專案來源檔案複製到容器中。 然後,我們使用發行組態並指定輸出路徑讓 .NET 來發佈我們的應用程式。

編譯應會成功。 現在,我們必須建置最終的映像。

提示

本快速入門會從來源建置 .NET core 專案。 建置容器映像時,最好將實際執行環境承載和其相依性包含在容器映像中。 我們不想讓 .NET core SDK 包含在最終的映像中,因為我們只需要 .NET core 執行階段,因此 dockerfile 會寫入為使用與 SDK (稱為 build-env) 一起封裝的暫存容器來建置應用程式。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

因為我們的應用程式是 ASP.NET,所以我們要指定包含此執行階段的映像。 然後,我們要將所有檔案從暫存容器的輸出目錄複製到最終容器中。 我們會將容器設定為在容器啟動時,以新的應用程式作為其進入點來執行

我們以寫入 dockerfile 以執行多階段建置。 當 dockerfile 執行時,它會使用暫存容器 build-env 搭配 .NET core 2.1 SDK,以建置範例應用程式,然後將輸出的二進位檔複製到只包含 .NET core 2.1 執行階段的其他容器中,以便我們將最終容器的大小降至最低。

建置和執行應用程式

寫入 Dockerfile 之後,我們可以將 Docker 指向我們的 Dockerfile,並告訴它建置並執行我們的映像:

  1. 在命令提示字元視窗中,瀏覽至 dockerfile 所在的目錄,然後執行 docker build 命令,以從 Dockerfile 建置容器。

    docker build -t my-asp-app .
    
  2. 若要執行新建置的容器,請執行 docker run 命令。

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    讓我們來仔細分析此命令:

    • -d 告訴 Docker 執行容器「卸離」,表示沒有主控台連接到容器內的主控台。 容器會在背景中執行。
    • -p 5000:80 指示 Docker 將主機上的埠 5000 對應至容器中的埠 80。 每個容器都會取得自己的 IP 位址。 根據預設,ASP .NET 會在埠 80 上接聽。 埠對應可讓我們移至對應埠上主機的 IP 位址,而 Docker 會將所有流量轉送至容器內的目的地埠。
    • --name myapp 告訴 Docker 提供此容器一個方便查詢的名稱,而不需要查閱 Docker 在執行階段指派的容器識別碼。
    • my-asp-app 是我們想要 Docker 執行的映像。 這是 docker build 程序的高潮所產生的容器映像。
  3. 開啟網頁瀏覽器並流覽至 http://localhost:5000 以查看您的容器化應用程式,如下列螢幕擷取畫面所示:

    ASP.NET Core 網頁,從容器中的 localhost 執行

接下來的步驟

  1. 下一步是使用 Azure Container Registry 將您的容器化 ASP.NET Web 應用程式發佈至私人登錄。 這可讓您將它部署在您的組織中。

    當您進入將容器映像推送至登錄的區段時,請指定您剛剛封裝 (my-asp-app) 的 ASP.NET 應用程式名稱以及您的容器登錄 (例如:contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    若要查看更多應用程式範例及其相關聯的 dockerfile,請參閱其他容器範例

  2. 將應用程式發佈至容器登錄之後,下一步就是將應用程式部署到您使用 Azure Kubernetes Service 建立的 Kubernetes 叢集。