練習 - 建置 .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 發行來建立產品後端映像檔

最新的 .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'.
    

    命令會讀取方案檔、判斷它包含三個專案、建置專案,以及為市集和產品專案建立映像。 圖片以專案命名,並發佈到本機 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 建立產品後端映像檔

如果您想要進一步控制映射的建置方式,您可以使用 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。
    • 將您所建立組建映像的應用程式目錄中的所有內容複製到此映像的應用程式目錄中。
    • 將此影像的進入點設定為 dotnet ,並以自變數的形式傳遞 Products.dll

建立 Docker 映像

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

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

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

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

  2. 在輸出大量內容後,將會生成影像。 輸入 docker images 會顯示程式代碼空間中所有影像的清單,包括 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. 若要 從新產品映像 建立和執行容器,並在埠 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"
        },
        ...
    ]