練習 - 建立協調流程的 Docker Compose 檔案
Contoso 戶外休閒用品公司有兩個服務,他們希望將這兩個服務組合在一起,作為一個單一的單元來進行組建和部署。 公司決定使用 Docker Compose 來一起建置服務。
在此練習中,您會建立 Docker Compose YAML 檔案。 然後,您使用 Docker Compose 公用程式來建立 Docker 容器映像並加以執行。
連線到 Codespace
如果您已中斷與上一個練習中所使用的 codespace 的連線,請立即重新連線:
- 開啟瀏覽器並移至 [eShopLite 存放庫]。
- 選取 [程式碼],然後選取 [Codespaces] 索引標籤。
- 選取您在上一個練習中所建立的 Codespace。 GitHub 會開啟該 Codespace。
- 移至 /dotnet-docker 目錄。
建立 Docker Compose 檔案
使用 docker-compose 檔案為後端和前端服務設定映像:
在 codespace 的 dotnet-docker 資料夾中,開啟名為 ./dotnet-docker/docker-compose.yml 的檔案。 這個檔案是空的。
將下列程式碼加入 docker-compose.yml 檔案中:
version: '3.4' services: frontend: image: store:latest environment: - ProductEndpoint=http://backend:8080 ports: - "32000:8080" depends_on: - backend backend: image: products:latest ports: - "32001:8080"
這個程式碼會執行多個工作:
- 它會建立前端網站,並將其命名為 frontend。
- 此程式碼會設定網站的環境變數:
ProductEndpoint=http://backend:8080
。 此程式碼是前端服務尋找「產品」後端服務的方式。 - 該程式碼會開啟一個連接埠並宣告它依賴於後端服務。
- 接下來會建立名為 backend 的後端服務。
- 最後一個命令會指定要開啟的連接埠。
相較之下,如果您有 dockerfiles,則需要使用 docker-compose.yml 檔案:
version: '3.4' services: frontend: image: storeimage build: context: . dockerfile: ./Store/Dockerfile environment: - ProductEndpoint=http://backend:8080 ports: - "32000:8080" depends_on: - backend backend: image: productservice build: context: . dockerfile: ./Products/Dockerfile ports: - "32001:8080"
程式碼幾乎完全相同。 唯一的差別是需要有指向每個 dockerfile 的建置階段。
建置映像並執行容器
現在,使用 Docker Compose 來建置並啟動前端和後端元件。
若要建置使用 .NET 容器支援的容器映像,請選取 [終端] 索引標籤,然後執行下列命令。 請注意,如果您的應用程式仍在執行中,請先使用 CTRL+C 關閉。
dotnet publish /p:PublishProfile=DefaultContainer
若要啟動前端網站和後端 Web API,請執行此命令:
docker compose up
某些輸出隨即出現,然後網站和 Web API 正在執行。 您應該會看到如以下範例所示的輸出:
[+] Running 2/0 ✔ Container finished-files-backend-1 Created 0.0s ✔ Container finished-files-frontend-1 Created 0.0s Attaching to backend-1, frontend-1 ... backend-1 | info: Microsoft.Hosting.Lifetime[0] backend-1 | Hosting environment: Production backend-1 | info: Microsoft.Hosting.Lifetime[0] backend-1 | Content root path: /app
若要測試前端服務,請選取 [連接埠] 索引標籤。然後,在 [前端] 連接埠的本機位址右側,選取地球圖示。 瀏覽器會顯示首頁。
選取產品。 目錄會顯示 Contoso 的商品。