本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

使用Docker Compose

Docker Compose 提供了一种编排多个协同工作的容器的方法。示例包括一个处理请求的服务和一个前端网站,或者一个使用支持功能(如 Redis 缓存)的服务。如果您正在使用微服务模型进行应用程序开发,可以使用 Docker Compose 将应用程序代码分解为多个独立运行的服务,并使用 web 请求进行通信。本文将帮助您为您的应用程序启用 Docker Compose,无论它们是 Node.js、Python 还是 .NET,并且还帮助您在 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))并使用容器:将Docker Compose文件添加到工作区命令。按照提示操作。

您可以在添加Dockerfile的同时将Docker Compose文件添加到您的工作区,方法是打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)),并使用容器:将Docker文件添加到工作区命令。系统会询问您是否要添加Docker Compose文件。如果您想保留现有的Dockerfile,请在覆盖Dockerfile时选择

容器工具扩展添加了docker-compose.yml将文件导入到你的工作区。该文件包含了在生产环境中按预期启动容器的配置。在某些情况下,一个docker-compose.debug.yml还会生成此文件。该文件提供了一种启动的简化模式,可以启用调试器。

使用docker-compose文件的项目截图

VS Code Container Tools 扩展生成的文件可以开箱即用,但您也可以自定义它们以优化您的场景。然后您可以使用 容器:Compose Up 命令(右键单击 docker-compose.yml 文件,或在 命令面板 中找到命令,以同时启动所有内容。您也可以使用 docker-compose 启动 在 VS Code 的命令提示符或终端Windows中输入命令以启动容器。请参阅 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文件以添加新服务。通常,您可以复制现有的服务部分,粘贴以创建一个新条目,并根据新服务更改名称。

你可以再次运行容器:将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放置在工作区根目录(例如,如果项目在项目1,那么文件在),所以当你添加另一个服务时,你在一个文件夹中创建另一个项目,例如项目2,请按照之前描述的步骤重新创建或修改docker-compose文件。

调试

首先,参考目标平台的调试文档,了解在容器中使用 VS Code 调试的基本知识:

如果您想在Docker Compose中调试,请运行命令 Containers: Compose Up,如前一节所述,使用其中两个Docker Compose文件之一,然后使用适当的 附加 启动配置进行附加。直接使用正常启动配置启动时不使用Docker Compose。

创建一个附加 启动配置。这是launch.json这个过程主要是手动的,但在某些情况下,Container Tools 扩展可以通过添加一个预配置的启动配置来帮助你,你可以将其用作模板并进行自定义。每个平台(Node.js、Python 和 .NET)的流程在以下各节中描述。

Node.js

  1. 调试标签页中,选择配置下拉菜单,选择新配置并选择容器:附加 配置模板 容器:连接到节点.

  2. 配置调试端口在docker-compose.debug.yml这是在创建文件时设置的,所以你可能不需要更改它。在下面的示例中,主机和容器都使用端口9229进行调试。

     版本'3.4'
    
     服务:
       node-hello:
         镜像: node-hello
         构建: .
         环境:
           NODE_ENV: 开发
         端口:
           - 3000
           - 9229:9229
         命令: node --inspect=0.0.0.0:9229 ./bin/www
    
  3. 如果你有多个应用程序,你需要为其中一些更改端口,以便每个应用程序都有一个唯一的端口。你可以在正确的调试端口上进行指向。launch.json,然后保存文件。如果省略此步骤,端口将自动选择。

    这是一个显示Node.js启动配置的示例 - 附加:

     "configurations": [
         {
             "type": "node",
             "request": "attach",
             "name": "Containers: Attach to Node",
             "remoteRoot": /usr/src/app",
             "port": 9229 // 可选;否则从docker-compose.debug.yml推断。
         },
         // ...
     ]
    
  4. 完成编辑 附件 配置后,保存 launch.json,并选择新的启动配置作为活动配置。在调试标签页中,找到配置下拉菜单中的新配置。

    配置下拉菜单的截图

  5. 右键单击docker-compose.debug.yml 文件并选择 撰写.

  6. 当您附加到一个暴露HTTP端点并返回HTML的服务时,网页浏览器不会自动打开。要以浏览器打开该应用程序,请在侧栏中选择容器,右键单击并选择在浏览器中打开。如果配置了多个端口,您将被要求选择端口。

  7. 以通常的方式启动调试器。从调试选项卡中,选择绿色箭头(启动按钮)或使用F5

Python

要使用Docker Compose调试Python,请按照以下步骤操作:

  1. 调试标签页中,选择配置下拉菜单,选择新配置,选择Python 调试器,并选择远程附加配置模板。

    Python 远程附加的截图

  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. 完成编辑 附件 配置后,保存 launch.json导航到调试标签页,并选择Python 调试器:远程附加作为活动配置。

  4. 如果您已经有一个有效的Dockerfile,我们建议运行命令容器:将Docker Compose文件添加到工作区。这将创建一个docker-compose.yml文件并且也是一个docker-compose.debug.yml,该卷映射并启动容器中的Python调试器。如果您还没有Dockerfile,我们建议运行Containers: Add Docker Files to Workspace并选择以包含Docker Compose文件。

    注意:默认情况下,当使用容器:将Docker文件添加到工作区时,选择Django和Flask选项将生成一个配置为Gunicorn的Dockerfile。请按照容器中的Python快速入门中的说明进行操作,以确保在继续之前已正确配置。

  5. 右键单击docker-compose.debug.yml 文件(如下例所示)并选择 撰写新邮件

    版本'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. 一旦你的容器构建并运行起来,通过按F5来附加调试器,选择Python Debugger: Remote Attach启动配置。

    Python 调试的截图

    注意: 如果您希望将Python调试器导入到特定文件中,可以在debugpy README中找到更多信息。

  7. 当您附加到一个暴露HTTP端点并返回HTML的服务时,网页浏览器可能不会自动打开。要在一个浏览器中打开该应用程序,请右键单击容器资源管理器中的容器并选择在浏览器中打开。如果配置了多个端口,您将被要求选择端口。

    截图 - 在浏览器中打开

    您现在正在容器中调试正在运行的应用程序。

.NET

  1. 调试标签页中,选择配置下拉菜单,选择新配置并选择容器附加 配置模板 容器: .NET 附加 (预览).

  2. VS Code 尝试复制vsdbg从主机到目标容器使用默认路径。您也可以提供现有实例的路径vsdbg附加 配置中。

     "netCore": {
         "debuggerPath": " /remote_debugger/vsdbg"
     }
    
  3. 完成编辑 附件 配置后,保存 launch.json,并选择新的启动配置作为活动配置。在调试标签页中,找到配置下拉菜单中的新配置。

  4. 右键单击docker-compose.debug.yml 文件并选择 撰写.

  5. 当您附加到一个暴露HTTP端点并返回HTML的服务时,网页浏览器不会自动打开。要以浏览器打开该应用程序,请在侧栏中选择容器,右键单击并选择在浏览器中打开。如果配置了多个端口,您将被要求选择端口。

  6. 以通常的方式启动调试器。从调试选项卡中,选择绿色箭头(启动按钮)或使用F5

    开始调试的截图

  7. 如果您尝试附加到在容器中运行的 .NET 应用程序,您将看到一个提示要求选择您的应用程序的容器。

    容器选择的截图

    要跳过此步骤,请在 launch.json 中指定容器名称在 附加 配置中:

        "containerName""您的容器名称"
    

    接下来,系统会询问你是否要复制调试器 (vsdbg) 放入容器。选择 .

    调试器提示的截图

如果一切配置正确,调试器应该已经附加到你的 .NET 应用程序。

调试会话的截图

卷宗挂载

默认情况下,Container Tools 扩展不会为调试组件进行任何卷挂载。在 .NET 或 Node.js 中不需要这样做,因为所需的组件已经内置在运行时中。如果您的应用程序需要卷挂载,请使用 指定它们。标签在docker-compose*.yml文件。

:
    - /主机文件夹路径:/容器文件夹路径

使用多个 Compose 文件的 Docker Compose

工作区可以有多个docker-compose文件来处理不同的环境,如开发、测试和生产。配置内容可以拆分为多个文件。例如,一个基础compose文件定义所有环境的公共信息,以及单独的覆盖文件定义特定于环境的信息。当这些文件作为输入传递给Docker Compose 命令,它将这些文件合并成一个配置。默认情况下,容器:Compose Up 命令将单个文件作为输入传递给compose命令,但您可以自定义组合向上 通过命令定制传递多个文件的命令。或者,您可以使用自定义任务来调用Docker Compose使用所需的参数输入命令。

注意:如果您的工作区有 docker-compose.ymldocker-compose.override.yml没有其他组合文件,那么Docker Compose命令没有输入文件并隐式使用这些文件。在这种情况下,不需要任何定制。

命令定制

命令定制 提供了多种定制方式 组合向上根据您的需求,以下是一些示例命令定制组合向上命令。

基础文件和覆盖文件

让我们假设你的工作区有一个基础的 Compose 文件 (docker-compose.yml) 和每个环境的覆盖文件 (docker-compose.dev.ymldocker-compose.test.ymldocker-compose.prod.yml) 而且你总是逃跑docker compose 启动带有基本文件和覆盖文件。在这种情况下,组合向上命令可以像以下示例那样自定义。当组合向上命令被调用时,${配置文件}被所选文件替换。

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

模板匹配

假设你为每个环境有一套不同的输入文件。你可以定义多个带有正则表达式匹配的模板,并且选择的文件名将与这个匹配。比赛将使用属性和相应的模板。

"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",
        "模板": "docker-compose -f docker-compose.yml -f docker-compose.release.yml -f docker-compose.prod.yml up -d --build",
        "匹配": "prod"
    }
]

调用命令时选择一个模板

如果你省略了比赛从命令模板中获取属性,每次都需要选择使用哪个模板组合向上命令被调用。例如:

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

下一步