使用 Docker Compose
Docker Compose 提供了一種編排多個協作容器的方法。例如處理請求的服務與前端網站,或是使用如 Redis 快取等支援功能的服務。如果您在應用程式開發中採用微服務模型,則可以使用 Docker Compose 將應用程式碼分解為多個透過網頁請求進行通訊的獨立執行服務。無論您使用的是 Node.js、Python 還是 .NET,本文都將協助您為應用程式啟用 Docker Compose,並協助您在 Visual Studio Code 中設定這些情境的偵錯功能。
此外,對於單一容器情境,使用 Docker Compose 可以提供與單一 Dockerfile 不同、且不依賴特定工具的設定方式。諸如容器的 Volume 掛載、連接埠對應 (port mappings) 以及環境變數等設定,皆可在 docker-compose YML 檔案中宣告。
若要使用 Container Tools 擴充功能在 VS Code 中使用 Docker Compose,您應已熟悉 Docker Compose 的基礎知識。
將 Docker Compose 支援新增至您的專案
如果您已經擁有一個或多個 Dockerfile,可以透過開啟命令選擇區 (Command Palette)(⇧⌘P (Windows, Linux Ctrl+Shift+P)),並使用 Containers: Add Docker Compose Files to Workspace 命令來新增 Docker Compose 檔案。接著請依照提示操作。
您可以在新增 Dockerfile 的同時,透過開啟命令選擇區(⇧⌘P (Windows, Linux Ctrl+Shift+P))並使用 Containers: Add Docker Files to Workspace 命令,將 Docker Compose 檔案新增至您的工作區。系統會詢問您是否要新增 Docker Compose 檔案。如果您希望保留現有的 Dockerfile,請在系統提示是否覆寫 Dockerfile 時選擇否 (No)。
Container Tools 擴充功能會將 docker-compose.yml 檔案新增至您的工作區。此檔案包含依照生產環境預期啟動容器所需的設定。在某些情況下,系統也會產生 docker-compose.debug.yml。此檔案提供了一種簡化的啟動模式,以便啟用偵錯工具。

VS Code Container Tools 擴充功能產生的檔案可直接使用,但您也可以針對您的情境進行自訂以達到最佳化。您可以接著使用 Containers: Compose Up 命令(在 docker-compose.yml 檔案上按一下右鍵,或在命令選擇區中尋找該命令)一次啟動所有項目。您也可以從 VS Code 的命令提示字元或終端機視窗使用 docker-compose up 命令來啟動容器。請參閱 Docker Compose 文件,了解如何設定 Docker Compose 行為以及有哪些可用的命令列選項。
有了 docker-compose 檔案,您現在可以在這些檔案中指定連接埠對應,而不必在 .json 設定檔中指定。範例請參閱 Docker Compose 文件。
提示:使用 Docker Compose 時,請勿指定主機連接埠。相反地,應讓 Docker 自動選擇一個可用的隨機連接埠,以避免連接埠衝突問題。
將新的容器新增至您的專案
如果您想要新增另一個應用程式或服務,可以再次執行 Containers: Add Docker Compose Files to Workspace 並選擇覆寫現有的 docker-compose 檔案,但這樣會導致這些檔案中的任何自訂設定遺失。如果您想要保留對 compose 檔案所做的變更,可以手動修改 docker-compose.yml 檔案來新增服務。通常,您可以複製現有的服務區段,貼上以建立新項目,並根據新服務的需求變更名稱。
您可以再次執行 Containers: Add Docker Files to Workspace 命令來為新的應用程式產生 Dockerfile。雖然每個應用程式或服務都有各自的 Dockerfile,但通常每個工作區只會有一個 docker-compose.yml 和一個 docker-compose.debug.yml 檔案。
在 Python 專案中,Dockerfile、.dockerignore 和 docker-compose*.yml 檔案全都位於工作區的根資料夾中。當您新增另一個應用程式或服務時,請將該 Dockerfile 移動至該應用程式的資料夾內。
在 Node.js 專案中,Dockerfile 和 .dockerignore 檔案會位於該服務的 package.json 旁邊。
.NET 的資料夾結構在建立 Docker Compose 檔案時已設定為可處理多個專案,.dockerignore 和 docker-compose*.yml 放置在工作區根目錄(例如,如果專案位於 src/project1,則檔案位於 src)。因此,當您新增另一個服務時,可以在一個資料夾(例如 project2)中建立另一個專案,並依照前述說明重新建立或修改 docker-compose 檔案。
偵錯
首先,請參閱您目標平台的偵錯文件,以了解在 VS Code 中進行容器偵錯的基礎知識。
如果您想要在 Docker Compose 中進行偵錯,請使用上一節所述的其中一個 Docker Compose 檔案執行 Containers: Compose Up 命令,然後使用適當的 Attach 啟動設定來進行附加。直接使用一般啟動設定進行啟動,並不會使用 Docker Compose。
建立一個 Attach 啟動設定。這是 launch.json 中的一個區段。此過程大多是手動的,但在某些情況下,Container Tools 擴充功能可以透過新增預先設定的啟動設定來提供協助,您可以將其用作範本並進行自訂。每個平台(Node.js、Python 和 .NET)的處理程序將在下列章節中說明。
Node.js
-
在偵錯 (Debug) 索引標籤上,選擇設定 (Configuration) 下拉式清單,選擇新增設定 (New Configuration),然後選擇
Containers: Attach設定範本 Containers: Attach to Node。 -
在
docker-compose.debug.yml中設定偵錯連接埠。此設定是在您建立檔案時設定的,因此您可能不需要變更它。在下方的範例中,連接埠 9229 用於主機和容器兩端的偵錯。version: '3.4' services: node-hello: image: node-hello build: . environment: NODE_ENV: development ports: - 3000 - 9229:9229 command: node --inspect=0.0.0.0:9229 ./bin/www -
如果您有多個應用程式,則需要為其中一些應用程式變更連接埠,以便每個應用程式都有唯一的連接埠。您可以在
launch.json中指向正確的偵錯連接埠並儲存檔案。如果省略此步驟,連接埠將會自動選擇。以下是 Node.js 啟動設定的範例 - Attach
"configurations": [ { "type": "node", "request": "attach", "name": "Containers: Attach to Node", "remoteRoot": "/usr/src/app", "port": 9229 // Optional; otherwise inferred from the docker-compose.debug.yml. }, // ... ] -
編輯完 Attach 設定後,請儲存
launch.json,並選擇您的新啟動設定作為作用中設定。在偵錯索引標籤中,於設定下拉式清單中找到新設定。
-
在
docker-compose.debug.yml檔案上按一下右鍵,並選擇 Compose Up。 -
當您附加到公開 HTML HTTP 端點的服務時,網頁瀏覽器不會自動開啟。若要在瀏覽器中開啟應用程式,請在側邊欄中選擇該容器,按一下右鍵並選擇 Open in Browser。如果設定了多個連接埠,系統會要求您選擇連接埠。
-
以一般方式啟動偵錯工具。在偵錯索引標籤中,選擇綠色箭頭(開始按鈕)或使用 F5。
Python
若要使用 Docker Compose 進行 Python 偵錯,請依照下列步驟操作:
-
在偵錯索引標籤上,選擇設定下拉式清單,選擇新增設定,選擇 Python Debugger,然後選擇
Remote Attach設定範本。
-
系統會提示您選擇要用於偵錯的主機機器(例如 localhost)和連接埠。Python 的預設偵錯連接埠為 5678。如果您有多個應用程式,則需要為其中一個應用程式變更連接埠,以便每個應用程式都有唯一的連接埠。您可以在
launch.json中指向正確的偵錯連接埠並儲存檔案。如果省略此步驟,連接埠將會自動選擇。"configurations": [ { "name": "Python Debugger: Remote Attach", "type": "debugpy", "request": "attach", "port": 5678, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ] } -
編輯完 Attach 設定後,請儲存
launch.json。瀏覽至偵錯索引標籤,並將 Python Debugger: Remote Attach 選擇為作用中設定。 -
如果您已經擁有有效的 Dockerfile,建議執行 Containers: Add Docker Compose Files to Workspace 命令。這將建立一個
docker-compose.yml檔案以及一個docker-compose.debug.yml檔案,後者會對 Python 偵錯工具進行 Volume 對應並在容器中啟動它。如果您尚未擁有 Dockerfile,建議執行 Containers: Add Docker Files to Workspace 並選擇 Yes 以包含 Docker Compose 檔案。注意:預設情況下,使用 Containers: Add Docker Files to Workspace 時,選擇 Django 和 Flask 選項將會建構一個針對 Gunicorn 設定的 Dockerfile。請依照 Python 容器快速入門中的說明,確保在繼續之前已正確完成設定。
-
在
docker-compose.debug.yml檔案(如下方範例所示)上按一下右鍵,並選擇 Compose Up。version: '3.4' services: pythonsamplevscodedjangotutorial: image: pythonsamplevscodedjangotutorial build: context: . dockerfile: ./Dockerfile command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload"] ports: - 8000:8000 - 5678:5678 -
容器建置並執行後,請在選取 Python Debugger: Remote Attach 啟動設定的情況下,按 F5 以附加偵錯工具。

注意:如果您想將 Python 偵錯工具匯入特定檔案,更多資訊可在 debugpy README 中找到。
-
當您附加到公開 HTTP 端點並傳回 HTML 的服務時,網頁瀏覽器可能不會自動開啟。若要在瀏覽器中開啟應用程式,請在 Container Explorer 中對容器按一下右鍵,並選擇 Open in Browser。如果設定了多個連接埠,系統會要求您選擇連接埠。

您現在正在對容器中執行的應用程式進行偵錯。
.NET
-
在偵錯索引標籤上,選擇設定下拉式清單,選擇新增設定,然後選擇
Container Attach設定範本 Containers: .NET Attach (Preview)。 -
VS Code 會嘗試使用預設路徑將
vsdbg從主機機器複製到目標容器。您也可以在 Attach 設定中提供現有vsdbg執行個體的路徑。"netCore": { "debuggerPath": "/remote_debugger/vsdbg" } -
編輯完 Attach 設定後,請儲存
launch.json,並選擇您的新啟動設定作為作用中設定。在偵錯索引標籤中,於設定下拉式清單中找到新設定。 -
在
docker-compose.debug.yml檔案上按一下右鍵,並選擇 Compose Up。 -
當您附加到公開 HTML HTTP 端點的服務時,網頁瀏覽器不會自動開啟。若要在瀏覽器中開啟應用程式,請在側邊欄中選擇該容器,按一下右鍵並選擇 Open in Browser。如果設定了多個連接埠,系統會要求您選擇連接埠。
-
以一般方式啟動偵錯工具。在偵錯索引標籤中,選擇綠色箭頭(開始按鈕)或使用 F5。

-
如果您嘗試附加到容器中執行的 .NET 應用程式,系統會提示您選擇應用程式的容器。

若要略過此步驟,請在 launch.json 中的 Attach 設定中指定容器名稱。
"containerName": "Your ContainerName"接著,系統會詢問您是否要將偵錯工具 (
vsdbg) 複製到容器中。請選擇 Yes。
如果一切設定正確,偵錯工具應該會成功附加到您的 .NET 應用程式。

Volume 掛載 (Volume mounts)
預設情況下,Container Tools 擴充功能不會針對偵錯元件進行任何 Volume 掛載。在 .NET 或 Node.js 中並不需要這麼做,因為所需的元件已內建於執行階段中。如果您的應用程式需要 Volume 掛載,請使用 docker-compose*.yml 檔案中的 volumes 標記來指定它們。
volumes:
- /host-folder-path:/container-folder-path
搭配多個 Compose 檔案使用 Docker Compose
工作區可以擁有多個 docker-compose 檔案,以處理開發、測試和生產等不同環境。設定內容可以分割成多個檔案。例如,一個定義所有環境通用資訊的基礎 compose 檔案,以及定義環境特定資訊的個別覆寫檔案。當這些檔案作為輸入傳遞給 docker-compose 命令時,它會將這些檔案合併為單一設定。預設情況下,Containers: Compose Up 命令會傳遞單一檔案作為 compose 命令的輸入,但您可以透過命令自訂來自訂 compose up 命令以傳遞多個檔案。或者,您可以使用自訂工作來使用所需的參數呼叫 docker-compose 命令。
注意:如果您的工作區擁有
docker-compose.yml和docker-compose.override.yml且沒有其他 compose 檔案,則docker-compose命令會在沒有輸入檔案的情況下被呼叫,並隱式使用這些檔案。在此情況下,無需進行任何自訂。
命令自訂
命令自訂提供了多種根據您的需求自訂 compose up 命令的方法。以下是 compose up 命令的幾個命令自訂範例。
基礎檔案與覆寫檔案
假設您的工作區擁有一個基礎 compose 檔案 (docker-compose.yml) 以及每個環境的覆寫檔案 (docker-compose.dev.yml、docker-compose.test.yml 和 docker-compose.prod.yml),並且您總是使用基礎檔案和一個覆寫檔案來執行 docker compose up。在此情況下,compose up 命令可以依照下列範例進行自訂。當呼叫 compose up 命令時,${configurationFile} 會被替換為所選的檔案。
"docker.commands.composeUp": [
{
"label": "override",
"template": "docker-compose -f docker-compose.yml ${configurationFile} up -d --build",
}
]
範本比對
假設您針對每個環境擁有一組不同的輸入檔案。您可以定義多個具有正規表示式比對的範本,所選的檔案名稱將會與此 match 屬性進行比對,並使用對應的範本。
"containers.commands.composeUp": [
{
"label": "dev-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.debug.yml -f docker-compose.dev.yml up -d --build",
"match": "dev"
},
{
"label": "test-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.debug.yml -f docker-compose.test.yml up -d --build",
"match": "test"
},
{
"label": "prod-match",
"template": "docker-compose -f docker-compose.yml -f docker-compose.release.yml -f docker-compose.prod.yml up -d --build",
"match": "prod"
}
]
在呼叫命令時選擇範本
如果您從命令範本中省略 match 屬性,則每次呼叫 compose up 命令時,系統都會詢問您要使用哪個範本。例如:
"containers.commands.composeUp": [
{
"label": "dev",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.dev.yml ${configurationFile} up -d --build"
},
{
"label": "test",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.test.yml ${configurationFile} up -d --build"
},
{
"label": "prod",
"template": "docker-compose -f docker-compose.yml -f docker-compose.common.prod.yml ${configurationFile} up -d --build"
},
],
自訂工作
您也可以定義如下的工作來呼叫 docker-compose 命令,而不是使用命令自訂。請參閱自訂工作以取得此選項的詳細資訊。
{
"type": "shell",
"label": "compose-up-dev",
"command": "docker-compose -f docker-compose.yml -f docker-compose.Common.yml -f docker-compose.dev.yml up -d --build",
"presentation": {
"reveal": "always",
"panel": "new"
}
}