練習 - 建置 .NET 微服務的容器映像
在此練習中,您會建立微服務端點,並使用 .NET SDK 和 Docker 將其容器化。
開啟開發環境
您可以選擇使用裝載本練習的 GitHub Codespace,或在 Visual Studio Code 本機上完成該練習。
若要使用 Codespace,請使用 此 Codespace 建立連結 來建立預先設定的 GitHub Codespace。
GitHub 需要幾分鐘的時間才能建立及設定 Codespace。 程式完成時,您會看到練習的程式代碼檔案。 此課程模組其餘部分所使用的程式代碼位於 /dotnet-docker 目錄中。
若要使用 Visual Studio Code,請將 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 存放庫複製到本機電腦。 然後:
- 安裝任何 系統需求 ,以在 Visual Studio Code 中執行開發容器。
- 請確保 Docker 正在運行。
- 在新的 Visual Studio Code 視窗中,開啟複製存放庫的資料夾
- 按下 Ctrl+Shift+P,以開啟命令選擇區。
- 搜尋:>開發容器:重建並在容器中重新開啟
- 從下拉式清單中選取 [eShopLite - dotnet-docker ]。 Visual Studio Code 會在本機上建立您的開發容器。
使用 .NET 發行來建立產品後端映像檔
最新的 .NET 8 版本可改善容器化的支援。 您可以使用 dotnet publish 命令來建立微服務的 Docker 映像。 命令會建立執行帳戶下 app 服務的無根容器映像。 使用無根容器對於安全性和效能而言非常有利。 命令會藉由檢查項目檔中的設定,瞭解如何挑選最佳基底映像。
若要建立所有 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 檔案庫。
檢查 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 服務的映像。
在 [檔案總管] 窗格中,在 ./dotnet-docker/Products 中建立名為 Dockerfile 的檔案。 檔案是空的。
輸入下列程式碼:
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。
- 拉取
在最後一行正下方,輸入下列程序代碼:
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。
- 將映像內的工作目錄設定為
在最後一行正下方,輸入下列程序代碼:
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 映射:
若要建立產品後端服務的映射,請移至 [終端機 ] 索引標籤,然後執行此命令:
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .這會在目前目錄中的 Dockerfile 中執行命令,並將標記 productsbackend:latest 套用至產生的映像。
在輸出大量內容後,將會生成影像。 輸入
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 服務。
若要 從新產品映像 建立和執行容器,並在埠 32001 上公開服務,請執行此命令:
docker run -it --rm -p 32001:8080 products或者,如果您想要使用 Dockerfile 執行您所建立的映射,請執行:
docker run -it --rm -p 32001:8080 productsbackend若要測試服務,請切換至 [ 埠 ] 索引標籤,然後在 後埠 的本機位址右側,選取地球圖示。 瀏覽器會在該地址開啟新的索引標籤。
若要查詢某些產品,請使用 /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" }, ... ]
