🚀 在 VS Code 中免費取得

使用 Docker Compose

Docker Compose 提供一種協調多個協同運作容器的方式。範例包括處理請求的服務和前端網站,或使用 Redis 快取等支援功能的服務。如果您在應用程式開發中使用微服務模型,則可以使用 Docker Compose 將應用程式程式碼分解為多個獨立執行的服務,這些服務使用 Web 請求進行通訊。本文說明如何為您的應用程式啟用 Docker Compose (無論是 Node.js、Python 或 .NET),並協助您在 Visual Studio Code 中針對這些情境設定除錯。

此外,對於單一容器情境,使用 Docker Compose 提供的工具獨立組態方式是單一 Dockerfile 無法提供的。容器的 Volume 掛載、Port 對應和環境變數等組態設定可以在 docker-compose YML 檔案中宣告。

若要在 VS Code 中使用 Docker 擴充功能來使用 Docker Compose,您應該已經熟悉 Docker Compose 的基本知識。

為您的專案新增 Docker Compose 支援

如果您已經有一個或多個 Dockerfile,您可以開啟命令選取區 (Command Palette),並使用「Docker: 將 Docker Compose 檔案新增至工作區」命令來新增 Docker Compose 檔案。依照提示操作。

您可以在將 Dockerfile 新增至工作區的同時新增 Docker Compose 檔案,方法是開啟命令選取區 (Command Palette) 並使用「Docker: 將 Docker 檔案新增至工作區」命令。系統會詢問您是否要新增 Docker Compose 檔案。如果您想保留現有的 Dockerfile,請在系統提示您覆寫 Dockerfile 時選擇「否」。

Docker 擴充功能會將 docker-compose.yml 檔案新增至您的工作區。此檔案包含在生產環境中啟動容器的組態。在某些情況下,也會產生 docker-compose.debug.yml。此檔案提供啟動的簡化模式,可啟用除錯工具。

Screenshot of project with docker-compose files

VS Code Docker 擴充功能產生開箱即用的檔案,但您也可以自訂這些檔案以針對您的情境進行最佳化。然後,您可以使用「Docker Compose Up」命令 (在 docker-compose.yml 檔案上按一下滑鼠右鍵,或在命令選取區中尋找該命令) 以一次啟動所有項目。您也可以從命令提示字元或 VS Code 中的終端機視窗使用 docker-compose up 命令來啟動容器。請參閱 Docker Compose 文件,以瞭解如何設定 Docker Compose 行為以及可用的命令列選項。

透過 docker-compose 檔案,您現在可以在 docker-compose 檔案中指定 Port 對應,而不是在 .json 組態檔案中。如需範例,請參閱 Docker Compose 文件

提示:使用 Docker Compose 時,請勿指定主機 Port。相反地,讓 Docker 選取隨機可用的 Port,以自動避免 Port 衝突問題。

為您的專案新增容器

如果您想要新增另一個應用程式或服務,您可以再次執行「將 Docker Compose 檔案新增至工作區」,並選擇覆寫現有的 docker-compose 檔案,但您將遺失這些檔案中的任何自訂設定。如果您想要保留對 Compose 檔案的變更,您可以手動修改 docker-compose.yml 檔案以新增服務。通常,您可以複製現有的服務區段,貼上以建立新項目,然後根據新服務變更名稱。

您可以再次執行「將 Docker 檔案新增至工作區」命令,以產生新應用程式的 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 檔案執行「Docker Compose Up」命令 (如上一節所述),然後使用適當的「Attach」啟動組態進行附加。直接使用一般啟動組態啟動不會使用 Docker Compose。

建立「Attach」啟動組態。這是 launch.json 中的一個區段。此程序大多是手動的,但在某些情況下,Docker 擴充功能可以透過新增預先設定的啟動組態來提供協助,您可以將其用作範本並自訂。以下章節說明每個平台 (Node.js、Python 和 .NET) 的程序。

Node.js

  1. 在「除錯」索引標籤上,選擇「組態」下拉式選單,選擇「新增組態」,然後選取「Docker Attach」組態範本「Node.js Docker Attach (預覽)」。

  2. docker-compose.debug.yml 中設定除錯 Port。這會在您建立檔案時設定,因此您可能不需要變更它。在以下範例中,Port 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. 如果您有多個應用程式,則需要變更其中一些應用程式的 Port,以便每個應用程式都有唯一的 Port。您可以在 launch.json 中指向正確的除錯 Port,然後儲存檔案。如果您省略此步驟,系統將自動選擇 Port。

    以下範例顯示 Node.js 啟動組態 - Attach

     "configurations": [
         {
             "type": "node",
             "request": "attach",
             "name": "Docker: Attach to Node",
             "remoteRoot": "/usr/src/app",
             "port": 9229 // Optional; otherwise inferred from the docker-compose.debug.yml.
         },
         // ...
     ]
    
  4. 完成編輯「Attach」組態後,儲存 launch.json,並將您的新啟動組態選取為作用中組態。在「除錯」索引標籤中,在「組態」下拉式選單中尋找新的組態。

    Screenshot of Configuration dropdown

  5. docker-compose.debug.yml 檔案上按一下滑鼠右鍵,然後選擇「Compose Up」。

  6. 當您附加到公開 HTTP 端點且傳回 HTML 的服務時,網頁瀏覽器不會自動開啟。若要在瀏覽器中開啟應用程式,請在側邊欄中選擇容器,按一下滑鼠右鍵,然後選擇「在瀏覽器中開啟」。如果設定了多個 Port,系統會要求您選擇 Port。

  7. 以一般方式啟動除錯工具。從「除錯」索引標籤中,選擇綠色箭頭 (開始 按鈕) 或使用 F5

Python

若要使用 Docker Compose 除錯 Python,請依照下列步驟執行

  1. 在「除錯」索引標籤上,選擇「組態」下拉式選單,選擇「新增組態」,選擇「Python Debugger」,然後選取「Remote Attach」組態範本。

    Screenshot of Python Remote Attach

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

         "configurations": [
         {
            "name": "Python Debugger: Remote Attach",
            "type": "debugpy",
            "request": "attach",
            "port": 5678,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "/app"
                }
            ]
        }
    
  3. 完成編輯「Attach」組態後,儲存 launch.json。導覽至「除錯」索引標籤,然後選取「Python Debugger: Remote Attach」作為作用中組態。

  4. 如果您已經有有效的 Dockerfile,我們建議執行「Docker: 將 Docker Compose 檔案新增至工作區」命令。這會建立 docker-compose.yml 檔案以及 docker-compose.debug.yml,後者會 Volume 對應並在容器中啟動 Python 除錯工具。如果您還沒有 Dockerfile,我們建議執行「Docker: 將 Docker 檔案新增至工作區」,然後選取「是」以包含 Docker Compose 檔案。

    注意:預設情況下,當使用「Docker: 將 Docker 檔案新增至工作區」時,選擇 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. 當您附加到公開 HTTP 端點且傳回 HTML 的服務時,網頁瀏覽器可能不會自動開啟。若要在瀏覽器中開啟應用程式,請在 Docker Explorer 中按一下滑鼠右鍵,然後選擇「在瀏覽器中開啟」。如果設定了多個 Port,系統會要求您選擇 Port。

    Screenshot - Open in Browser

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

.NET

  1. 在「除錯」索引標籤上,選擇「組態」下拉式選單,選擇「新增組態」,然後選取「Docker Attach」組態範本「.NET Core Docker Attach (預覽)」。

  2. VS Code 嘗試使用預設路徑將 vsdbg 從主機複製到目標容器。您也可以在「Attach」組態中提供現有 vsdbg 執行個體的路徑。

     "netCore": {
         "debuggerPath": "/remote_debugger/vsdbg"
     }
    
  3. 完成編輯「Attach」組態後,儲存 launch.json,並將您的新啟動組態選取為作用中組態。在「除錯」索引標籤中,在「組態」下拉式選單中尋找新的組態。

  4. docker-compose.debug.yml 檔案上按一下滑鼠右鍵,然後選擇「Compose Up」。

  5. 當您附加到公開 HTTP 端點且傳回 HTML 的服務時,網頁瀏覽器不會自動開啟。若要在瀏覽器中開啟應用程式,請在側邊欄中選擇容器,按一下滑鼠右鍵,然後選擇「在瀏覽器中開啟」。如果設定了多個 Port,系統會要求您選擇 Port。

  6. 以一般方式啟動除錯工具。從「除錯」索引標籤中,選擇綠色箭頭 (開始 按鈕) 或使用 F5

    Screenshot of starting debugging

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

    Screenshot of container selection

    若要略過此步驟,請在 launch.json 的「Attach」組態中指定容器名稱

        "containerName": "Your ContainerName"
    

    接下來,系統會詢問您是否要將除錯工具 (vsdbg) 複製到容器中。選擇「是」。

    Screenshot of debugger prompt

如果一切都設定正確,除錯工具應該會附加到您的 .NET 應用程式。

Screenshot of debug session

Volume 掛載

預設情況下,Docker 擴充功能不會針對除錯元件執行任何 Volume 掛載。在 .NET 或 Node.js 中不需要這樣做,因為必要的元件已建置到執行階段中。如果您的應用程式需要 Volume 掛載,請使用 docker-compose*.yml 檔案中的 volumes 標籤來指定它們。

volumes:
    - /host-folder-path:/container-folder-path

搭配多個 Compose 檔案的 Docker Compose

工作區可以有多個 docker-compose 檔案,以處理不同的環境,例如開發、測試和生產環境。組態的內容可以分割成多個檔案。例如,基礎 Compose 檔案,用於定義所有環境的通用資訊,以及個別的覆寫檔案,用於定義環境特定的資訊。當這些檔案作為輸入傳遞至 docker-compose 命令時,它會將這些檔案合併為單一組態。預設情況下,「Docker: 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 命令,如下列範例所示。當叫用 ${configurationFile} 命令時,${configurationFile} 會由選取的檔案取代。

"docker.commands.composeUp": [
    {
        "label": "override",
        "template": "docker-compose -f docker-compose.yml ${configurationFile}  up -d --build",
    }
]

範本比對

假設您每個環境都有一組不同的輸入檔案。您可以定義多個具有正則運算式比對的範本,選取的檔案名稱將與此 match 屬性比對,並使用對應的範本。

"docker.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 命令時,系統都會詢問您要使用哪個範本。例如

"docker.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"
  }
}

後續步驟