現已釋出!閱讀關於 11 月新增功能和修復的內容。

使用 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。此檔案提供了一個簡化的啟動模式,可以啟用偵錯程式。

Screenshot of project with docker-compose files

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.dockerignoredocker-compose*.yml 檔案。當您新增另一個應用程式或服務時,將 Dockerfile 移至應用程式的資料夾中。

在 Node.js 專案中,Dockerfile.dockerignore 檔案將位於相應服務的 package.json 檔案旁邊。

對於 .NET,當您建立 Docker Compose 檔案時,資料夾結構已設定為處理多個專案。.dockerignoredocker-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

  1. 在 **Debug** 選項卡上,選擇 **Configuration** 下拉選單,選擇 **New Configuration**,然後選擇 Containers: Attach to Node 模板。

  2. 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
    
  3. 如果您有多個應用程式,則需要更改其中一些應用程式的埠,以便每個應用程式都有唯一的埠。您可以在 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.
         },
         // ...
     ]
    
  4. 完成編輯 **Attach** 配置後,儲存 launch.json,然後選擇新啟動配置作為活動配置。在 **Debug** 選項卡上,在 **Configuration** 下拉選單中找到新配置。

    Screenshot of Configuration dropdown

  5. 右鍵單擊 docker-compose.debug.yml 檔案,然後選擇 **Compose Up**。

  6. 當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器不會自動開啟。要開啟瀏覽器中的應用程式,請在邊欄中選擇容器,右鍵單擊並選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。

  7. 以通常方式啟動偵錯程式。從 **Debug** 選項卡中,選擇綠色箭頭(**Start** 按鈕)或使用 F5

Python

要使用 Docker Compose 除錯 Python,請按照以下步驟操作

  1. 在 **Debug** 選項卡上,選擇 **Configuration** 下拉選單,選擇 **New Configuration**,選擇 **Python Debugger**,然後選擇 Remote Attach 配置模板。

    Screenshot of Python Remote Attach

  2. 系統會提示您選擇要用於除錯的主機(例如 localhost)和埠。Python 的預設除錯埠是 5678。如果您有多個應用程式,則需要更改其中一個應用程式的埠,以便每個應用程式都有唯一的埠。您可以在 launch.json 中指向正確的除錯埠,然後儲存檔案。如果省略此項,則會自動選擇埠。

         "configurations": [
         {
            "name": "Python Debugger: Remote Attach",
            "type": "debugpy",
            "request": "attach",
            "port": 5678,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "/app"
                }
            ]
        }
    
  3. 完成編輯 **Attach** 配置後,儲存 launch.json。導航到 **Debug** 選項卡,並將 **Python Debugger: Remote Attach** 選為活動配置。

  4. 如果您已經有一個有效的 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 快速入門 中的說明,以確保其配置正確,然後再繼續。

  5. 右鍵單擊 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
    
  6. 在容器構建並執行後,透過在選中 **Python Debugger: Remote Attach** 啟動配置的情況下按 F5 來附加偵錯程式。

    Screenshot of debugging in Python

    注意:如果您想將 Python 偵錯程式匯入到特定檔案中,可以在 debugpy README 中找到更多資訊。

  7. 當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器可能不會自動開啟。要開啟瀏覽器中的應用程式,請在 Container Explorer 中右鍵單擊容器,然後選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。

    Screenshot - Open in Browser

    現在您正在除錯容器中執行的應用程式。

.NET

  1. 在 **Debug** 選項卡上,選擇 **Configuration** 下拉選單,選擇 **New Configuration**,然後選擇 Container Attach 配置模板 **Containers: .NET Attach (Preview)**。

  2. VS Code 會嘗試將 vsdbg 從主機複製到目標容器,使用預設路徑。您也可以在 **Attach** 配置中提供指向現有 vsdbg 例項的路徑。

     "netCore": {
         "debuggerPath": "/remote_debugger/vsdbg"
     }
    
  3. 完成編輯 **Attach** 配置後,儲存 launch.json,然後選擇新啟動配置作為活動配置。在 **Debug** 選項卡上,在 **Configuration** 下拉選單中找到新配置。

  4. 右鍵單擊 docker-compose.debug.yml 檔案,然後選擇 **Compose Up**。

  5. 當您附加到公開返回 HTML 的 HTTP 端點時,Web 瀏覽器不會自動開啟。要開啟瀏覽器中的應用程式,請在邊欄中選擇容器,右鍵單擊並選擇 **Open in Browser**。如果配置了多個埠,系統會要求您選擇埠。

  6. 以通常方式啟動偵錯程式。從 **Debug** 選項卡中,選擇綠色箭頭(**Start** 按鈕)或使用 F5

    Screenshot of starting debugging

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

    Screenshot of container selection

    要跳過此步驟,請在 launch.json 的 **Attach** 配置中指定容器名稱。

        "containerName": "Your ContainerName"
    

    接下來,系統會詢問您是否要將偵錯程式 (vsdbg) 複製到容器中。選擇 **Yes**。

    Screenshot of debugger prompt

如果所有配置都正確,偵錯程式應該已附加到您的 .NET 應用程式。

Screenshot of debug session

卷掛載

預設情況下,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.ymldocker-compose.override.yml 而沒有其他 compose 檔案,則 docker-compose 命令將在沒有輸入檔案的情況下呼叫,並隱式使用這些檔案。在這種情況下,無需進行自定義。

命令自定義

命令自定義 提供了各種方法來根據您的需求自定義 compose up 命令。以下是一些 compose up 命令的示例命令自定義。

基礎檔案和覆蓋檔案

假設您的工作區有一個基礎 compose 檔案 (docker-compose.yml) 和每個環境的覆蓋檔案 (docker-compose.dev.ymldocker-compose.test.ymldocker-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"
  }
}

後續步驟

© . This site is unofficial and not affiliated with Microsoft.