練習 - 建置 .NET 微服務的容器映像

已完成

在本練習中,您將建立微服務端點並使用 .NET SDK 和 Docker 將其容器化。

注意

您可以在已預安裝 Docker.NET SDK 的 GitHub Codespaces 執行個體中完成本練習。 當您在自己的開發環境中使用這些工具和技術時,請確定您已安裝這些先決條件。

開啟開發環境

您可以選擇使用裝載本練習的 GitHub Codespace,或在 Visual Studio Code 本機上完成該練習。

若要使用 Codespace,請使用 此 Codespace 建立連結 來建立預先設定的 GitHub Codespace。

GitHub 需要幾分鐘的時間來建立及設定 Codespace。 流程完成後,您即會看到此練習的程式碼檔案。 用於本課程模組其餘部分的程式碼位於 /dotnet-docker 目錄中。

若要使用 Visual Studio Code,請將 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 存放庫複製到本機電腦。 接下來:

  1. 安裝任何系統要求,以在 Visual Studio Code 中執行開發容器。
  2. 確定 Docker 是執行狀態。
  3. 在新的 Visual Studio Code 視窗中,開啟複製存放庫的資料夾
  4. 按下 Ctrl+Shift+P,以開啟命令選擇區。
  5. 搜尋:>開發容器:重建並在容器中重新開啟
  6. 從下拉式清單中選取 eShopLite - dotnet-docker。 Visual Studio Code 會在本機上建立您的開發容器。

使用 .NET publish 來建立 Products 後端映像

最新的 .NET 8 版本會提升對容器化的支援。 您可以使用 dotnet publish 命令來為您的微服務建立 Docker 映像。 命令會建立無根容器映像,可執行 app 帳戶下的服務。 執行無根容器對安全性和效能非常重要。 該命令知道如何透過檢查專案檔中的設定來挑選最佳的基礎映像。

  1. 若要為所有 eShopLite 服務建立映像,請移至 ​[終端機] 索引標籤,然後執行此命令:

    cd ./dotnet-docker 
     dotnet publish /p:PublishProfile=DefaultContainer
    

    您應該會看到類似下列訊息的輸出:

    DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/
    Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Pushed image 'store:latest' to local registry via 'docker'.
    Pushed image 'products:latest' to local registry via 'docker'.
    

    該命令會讀取解決方案檔案,已決定其包含三個專案、完成了建置,並為 store 和 products 專案建立了映像。 映像會以專案命名並發佈到本機 Docker 登錄中。

  2. 檢查 Docker 中是否有可用的映像:

    docker images
    

    您應該會看到類似下列訊息的輸出:

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   About a minute ago   293MB
    store                               latest    e9458c3abdb1   About a minute ago   218MB
    

使用 Dockerfile 來建立 Products 後端映像

如果您想要進一步控制映像的建置方式,您可以使用 Dockerfile 來建立 Products Web 服務的映像。

  1. 在 [檔案總管] 窗格中,在 ./dotnet-docker/Products 中建立名為 Dockerfile 的檔案。 檔案是空白的。

  2. 輸入下列程式碼:

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    
    WORKDIR /DataEntities
    COPY "DataEntities/DataEntities.csproj" .
    RUN dotnet restore
    COPY "DataEntities" .
    RUN dotnet publish -c release -o /app
    

    完成下列步驟之後,此程式碼會在 Products Docker 映像中設定 DataEntities 程式庫:

    • 提取 mcr.microsoft.com/dotnet/sdk:8.0 映像並命名映像 build
    • 將映像內的工作目錄設定為 /DataEntities
    • 將在本機找到之名為 DataEntities.csproj 的檔案複製到您建立的 /DataEntities 目錄。
    • 在專案上呼叫 dotnet restore
    • 將本機 DataEntities 目錄中的所有內容複製到映像。
    • 在專案上呼叫 dotnet publish
  3. 在最後一行的正下方,輸入此程式碼:

     WORKDIR /src
     COPY Products/Products.csproj .
     RUN dotnet restore
     COPY Products .
     RUN dotnet publish -c release -o /app
    

    此程式碼會在叫用時依序進行下列步驟:

    • 將映像內的工作目錄設定為 /src
    • 將在本機找到之名為 Products.csproj 的檔案複製到您建立的 /src 目錄。
    • 在專案上呼叫 dotnet restore
    • 將本機 Products 目錄中的所有內容複製到映像。
    • 在專案上呼叫 dotnet publish
  4. 在最後一行的正下方,輸入此程式碼:

     FROM mcr.microsoft.com/dotnet/aspnet:8.0
     WORKDIR /app
     EXPOSE 80
     EXPOSE 443
     COPY --from=build /app .
     ENTRYPOINT ["dotnet", "Products.dll"]
    

    此程式碼會在叫用時依序進行下列步驟:

    • 提取 mcr.microsoft.com/dotnet/aspnet:8.0 映像。
    • 將映像內的工作目錄設定為 /app
    • 公開連接埠 80 和 443。
    • 將您所建立之 build 映像的應用程式目錄中的所有內容,複製到此映像的應用程式目錄中。
    • 將此映像的進入點設定為 dotnet,並以引數的形式傳遞 Products.dll

建立 Docker 映像

完成 Dockerfile 之後,下一個步驟是使用它來建立 Docker 映像:

  1. 若要為 Products 後端服務建立映像,請移至 [終端機] 索引標籤,然後執行此命令:

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    這會在目前目錄的 Dockerfile 中執行命令,並將標記 productsbackend:latest 套用至產生的映像。

  2. 大量輸出之後,將會建置映像。 輸入 docker images 會顯示 codespace 中所有映像的清單,包括 productsbackend。 另一個映像則是 codespace 本身的映像。

    您應該會看到類似下列訊息的輸出:

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   10 minutes ago       293MB
    store                               latest    e9458c3abdb1   10 minutes ago       218MB
    productsbackend                     latest   190783f7e06f    About a minute ago   293MB
    

請考慮使用 dotnet publish 和必須針對應用程式中每個微服務手動建立 Dockerfiles 之間的差異。

執行容器並測試服務

現在您可以使用映像來執行並裝載 Products 服務。

  1. 若要從新的 products 映像建立和執行容器,並在連接埠 32001 上公開服務,請執行此命令:

    docker run -it --rm -p 32001:8080  products
    

    或者,如果您想要使用 Dockerfile 執行您所建立的映像,請執行:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. 若要測試服務,請切換至 [連接埠] 索引標籤,然後在 [後端] 連接埠的本機位址右側,選取地球圖示。 瀏覽器會在該位址開啟新的索引標籤。

    顯示如何連線至後端產品服務的螢幕擷取畫面。

  3. 若要查詢某些產品,請在位址附加 /api/product ,然後按 Enter。 您應該會看到以 JSON 格式列出的一些產品資訊。

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    ]