撰写常见问题解答

重要的

Docker 的文档引用并描述了 Compose V2 功能。

自 2023 年 7 月起,Compose V1 停止接收更新,并且不再出现在新的 Docker Desktop 版本中。 Compose V2 已取代它,并且现已集成到所有当前的 Docker Desktop 版本中。有关更多信息,请参阅 迁移到 Compose V2

docker compose 和 docker-compose 有什么区别

Docker Compose 命令行二进制文件的第一版于 2014 年首次发布。它是用 Python 编写的,并通过docker-compose.通常,Compose V1 项目在 compose.yml 文件中包含一个顶级版本元素,其值范围从 2.0 到 3.8,它指的是特定的文件格式。

Docker Compose 命令行二进制文件的第二版于 2020 年发布,用 Go 编写,并使用docker compose. Compose V2 忽略 compose.yml 文件中的版本顶级元素。

有关更多信息,请参阅 Compose 的历史和发展

启动、运行和启动之间有什么区别?

通常,您想要docker compose up.用于up启动或重新启动compose.yml.在默认的“附加”模式下,您可以看到来自所有容器的所有日志。在“分离”模式 ( -d) 下,Compose 在启动容器后退出,但容器继续在后台运行。

docker compose run命令用于运行“一次性”或“临时”任务。它需要您要运行的服务名称,并且仅启动正在运行的服务所依赖的服务的容器。用于run运行测试或执行管理任务,例如删除数据或将数据添加到数据卷容器。该run命令的作用类似于docker run -ti打开容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。

docker compose start命令仅适用于重新启动之前创建但已停止的容器。它从不创建新的容器。

为什么我的服务需要 10 秒才能重新创建或停止?

docker compose stop命令尝试通过发送SIGTERM.然后等待 10 秒的默认超时。超时后,SIGKILL向容器发送a,强制杀死容器。如果您正在等待此超时,则意味着您的容器在收到信号时并未关闭SIGTERM

关于进程在容器中处理信号的问题已经有很多文章了 。

要解决此问题,请尝试以下操作:

  • 确保您 在 Dockerfile 中使用CMD和的 exec 形式。ENTRYPOINT

    例如使用["program", "arg1", "arg2"]not "program arg1 arg2"。使用字符串形式会导致 Docker 运行您的进程,bash但它不能正确处理信号。 Compose 始终使用 JSON 形式,因此如果您覆盖 Compose 文件中的命令或入口点,请不要担心。

  • 如果可以的话,修改您正在运行的应用程序以添加显式信号处理程序SIGTERM

  • 将 设为stop_signal应用程序知道如何处理的信号:

    services:
      web:
        build: .
        stop_signal: SIGINT
  • 如果您无法修改应用程序,请将应用程序包装在轻量级 init 系统(如 s6)或信号代理(如 dumb-inittini)中。这些包装器中的任何一个都可以SIGTERM正确处理。

如何在同一主机上运行 Compose 文件的多个副本?

Compose 使用项目名称为项目的所有容器和其他资源创建唯一标识符。要运行项目的多个副本,请使用-p命令行选项COMPOSE_PROJECT_NAME环境变量设置自定义项目名称。

我可以在 Compose 文件中使用 JSON 而不是 YAML 吗?

是的。 YAML 是 JSON 的超集,因此任何 JSON 文件都应该是有效的 YAML。要将 JSON 文件与 Compose 一起使用,请指定要使用的文件名,例如:

$ docker compose -f docker-compose.json up

我应该将我的代码包含在 COPY/ADD 或卷中吗?

COPY您可以使用或ADD中的指令 将代码添加到图像中Dockerfile。如果您需要将代码与 Docker 映像一起重新定位,例如当您将代码发送到另一个环境(生产、CI 等)时,这非常有用。

volume如果您想要对代码进行更改并立即看到它们的反映,例如当您正在开发代码并且您的服务器支持热代码重新加载或实时重新加载时,请使用 a。

在某些情况下您可能想同时使用两者。您可以使用 使映像包含代码COPY,并在 Compose 文件中使用 来volume包含开发期间来自主机的代码。该卷覆盖图像的目录内容。