使用 Docker Compose
Docker Compose 提供了一種編排協同工作的多個容器的方式。例如,一個處理請求的服務和一個前端網站,或者一個使用 Redis 快取等支援功能的 تعالی。如果您正在為您的應用程式開發使用微服務模型,您可以使用 Docker Compose 將應用程式程式碼拆分成多個獨立執行並透過 Web 請求進行通訊的服務。本文將幫助您為 Node.js、Python 或 .NET 應用程式啟用 Docker Compose,並幫助您配置 Visual Studio Code 中這些場景的除錯。
此外,對於單容器場景,使用 Docker Compose 可提供獨立於工具的配置,而單個 Dockerfile 則不行。諸如容器的卷掛載、埠對映和環境變數之類的配置設定可以在 docker-compose YML 檔案中宣告。
要在 VS Code 中使用 Container Tools 擴充套件來使用 Docker Compose,您應該已經熟悉 Docker Compose 的基礎知識。
為專案新增 Docker Compose 支援
如果您已經有一個或多個 Dockerfile,則可以透過開啟 **命令面板**(⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後使用 **Containers: Add Docker Compose Files to Workspace** 命令來新增 Docker Compose 檔案。按照提示操作。
您可以在新增 Dockerfile 的同時將 Docker Compose 檔案新增到您的工作區,方法是開啟 **命令面板**(⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後使用 **Containers: Add Docker Files to Workspace** 命令。系統會詢問您是否要新增 Docker Compose 檔案。如果您想保留現有的 Dockerfile,請在提示是否覆蓋 Dockerfile 時選擇 **否**。
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 檔案後,您現在可以在 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 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,然後選擇新啟動配置作為活動配置。在 **Debug** 選項卡上,在 **Configuration** 下拉選單中找到新配置。
-
右鍵單擊
docker-compose.debug.yml檔案,然後選擇 **Compose Up**。 -
當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器不會自動開啟。要開啟瀏覽器中的應用程式,請在邊欄中選擇容器,右鍵單擊並選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。
-
以通常方式啟動偵錯程式。從 **Debug** 選項卡中,選擇綠色箭頭(**Start** 按鈕)或使用 F5。
Python
要使用 Docker Compose 除錯 Python,請按照以下步驟操作
-
在 **Debug** 選項卡上,選擇 **Configuration** 下拉選單,選擇 **New Configuration**,選擇 **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。導航到 **Debug** 選項卡,並將 **Python Debugger: Remote Attach** 選為活動配置。 -
如果您已經有一個有效的 Dockerfile,我們建議執行 **Containers: Add Docker Compose Files to Workspace** 命令。這將建立一個
docker-compose.yml檔案以及一個docker-compose.debug.yml檔案,該檔案會卷掛載並將 Python 偵錯程式啟動到容器中。如果您還沒有 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 中找到更多資訊。
-
當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器可能不會自動開啟。要開啟瀏覽器中的應用程式,請在 Container Explorer 中右鍵單擊容器,然後選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。

現在您正在除錯容器中執行的應用程式。
.NET
-
在 **Debug** 選項卡上,選擇 **Configuration** 下拉選單,選擇 **New Configuration**,然後選擇
Container Attach配置模板 **Containers: .NET Attach (Preview)**。 -
VS Code 會嘗試將
vsdbg從主機複製到目標容器,使用預設路徑。您也可以在 **Attach** 配置中提供指向現有vsdbg例項的路徑。"netCore": { "debuggerPath": "/remote_debugger/vsdbg" } -
完成編輯 **Attach** 配置後,儲存
launch.json,然後選擇新啟動配置作為活動配置。在 **Debug** 選項卡上,在 **Configuration** 下拉選單中找到新配置。 -
右鍵單擊
docker-compose.debug.yml檔案,然後選擇 **Compose Up**。 -
當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器不會自動開啟。要開啟瀏覽器中的應用程式,請在邊欄中選擇容器,右鍵單擊並選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。
-
以通常方式啟動偵錯程式。從 **Debug** 選項卡中,選擇綠色箭頭(**Start** 按鈕)或使用 F5。

-
如果您嘗試附加到在容器中執行的 .NET 應用程式,您將看到一個提示,要求您選擇應用程式的容器。

要跳過此步驟,請在 launch.json 的 **Attach** 配置中指定容器名稱。
"containerName": "Your ContainerName"接下來,系統會詢問您是否要將偵錯程式 (
vsdbg) 複製到容器中。選擇 **Yes**。
如果所有配置都正確,偵錯程式應該已附加到您的 .NET 應用程式。

卷掛載
預設情況下,Container Tools 擴充套件不會為除錯元件執行任何卷掛載。對於 .NET 或 Node.js,這沒有必要,因為必需的元件已內建到執行時中。如果您的應用程式需要卷掛載,請使用 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"
}
}