【问题标题】:What's the difference between a stack file and a Compose file?堆栈文件和 Compose 文件有什么区别?
【发布时间】:2017-08-23 06:56:29
【问题描述】:

我正在学习如何使用 Docker Compose 在多个容器中跨多个主机部署应用程序。而且我遇到了两个配置文件 - 堆栈文件和 Compose 文件。

Cloud stack file YAML reference 开始,它指出堆栈文件是一种 YAML 格式的文件,它定义了一个或多个服务,类似于 docker-compose.yml 文件,但有一些扩展名。

this post 开始,它指出堆栈与 docker-compose 非常相似,只是它们定义了服务,而 docker-compose 定义了容器

它们看起来非常相似,所以我想知道何时使用堆栈文件,何时使用 Compose 文件?

【问题讨论】:

  • 好问题。我还想问一下,既然我们已经有了 docker compose,为什么还需要 Docker 堆栈?在第二个链接中,它指出 docker stack 是 docker 引擎的服务,而 docker compose 不是。那为什么我们不能只升级 docker compose 并使其成为服务呢?
  • @lonelyloner 好问题,我猜这是因为 docker-compose 是它自己的工具,它没有集成到 docker 中。在 Linux 上,我必须单独安装它,而在 Windows 上,我相信它与 Docker 一起安装。希望将来 docker 将它们合并,并且将只有堆栈文件。

标签: docker docker-compose docker-swarm docker-swarm-mode


【解决方案1】:

从概念上讲,这两个文件的用途相同 - 在 docker 引擎上部署和配置容器。

Docker-compose 工具是首先创建的,其目的是在单个 Docker 引擎上“定义和运行多容器 Docker 应用程序”。 (见docker compose overview

您使用docker-compose up 来创建/更新您的容器、网络、卷等。

Docker Stack 在 Docker Swarm(Docker 的编排和调度工具)中使用,因此它具有单个 Docker 不需要的额外配置参数(即副本、部署、角色)引擎。

堆栈文件由docker stack 命令解释。该命令只能从 docker swarm manager 调用。

您可以将 docker-compose.yml 转换为 docker-cloud.yml 并返回。但是,正如您的问题所述,您必须注意差异。此外,您需要记住 docker-compose 有不同的版本。目前最新版本是第3版。(https://docs.docker.com/compose/compose-file/)

编辑:一个有趣的博客,可能有助于理解差异,可以在这里找到https://blog.nimbleci.com/2016/09/14/docker-stacks-and-why-we-need-them/

【讨论】:

  • 是的,这让我很困惑,因为 Compose 文件还提到了与 swarm 相关的属性,例如 deploy,当您使用 docker compose 时会忽略这些属性,并且仅在 docker stack deploy 有效。我想,出于所有意图和目的,对于 3+ 版本的 compose,它们是相同的吗?
  • 版本 3 与 2 不同。不是很多。尤其是声明卷的方式。还有其他变化。版本 3 compose 应该能够在不更改的情况下在 swarm 上工作,但实际上您可能希望添加 swarm 配置,特别是如果您的容器有卷并且您无法承受重新部署时丢失它们的数据。
  • @sudo "docker stack" 仅适用于 Docker Swarm。 docker-compose 是一个停靠插件,可帮助在单个 docker 引擎上编排服务。 Docker 堆栈是 docker-compose 的一个智囊。希望在未来,他们会合并在一起,只保留 docker stack
【解决方案2】:

注意:问题猜测 Docker Cloud 参考是理解堆栈的首选,它很有用,但这不是堆栈与 compose 的权威来源——而是是特定于 Docker 托管服务的指南:“Docker Cloud 提供具有构建和测试设施的托管注册表服务。”有关文件文档,请参阅Compose file version 3 format——虽然它被命名为“Compose”,但这是一个权威的地方,功能可以同时使用 compose 和 swarm/stack,以及如何使用。

您可以通过两种方式指定一组 Docker 容器进行配置和部署:

  1. Docker 撰写 (docker-compose up)
  2. Docker 群 (docker swarm init; docker stack deploy --compose-file docker-stack.yml mystack)

两者都采用在 Docker Compose file version 3 format 中编写的 YAML 文件。该参考资料是记录 docker-compose 和 docker swarm/stack 配置的主要来源。

但是,您可以在两个 yml 文件中执行的操作之间存在特定差异——特定选项和特定命名约定:

选项

可用的服务配置选项记录在Compose file reference 页面上——通常在选项条目的底部有一个注释,将其描述为被docker stack deploydocker-compose up 忽略。

例如,以下选项是 ignored when deploying a stack in swarm mode 和(版本 3)撰写文件:

build、cap_add、cap_drop、cgroup_parent、container_name、depends_on、devices、external_links、links、network_mode、restart、security_opt、stop_signal、sysctls、tmpfs(版本 3-3.5)、userns_mode

...虽然docker-compose 忽略了某些选项,但可以与docker stack deploy 一起使用,例如:

部署,restart_policy

从命令行运行时,docker stack deploy 将打印有关它忽略哪些选项的警告:

忽略不支持的选项:链接

文件命名

  • 对于docker-compose up,如果没有使用-f 指定备用文件名,则默认文件名是docker-compose.yml(请参阅compose reference)。通常使用此默认名称并运行不带参数的命令。

  • 对于docker stack deploydocker stack deploy reference 中没有给出默认文件。你可以使用任何你想要的名字,但是这里有三个约定:

    1. 使用docker-stack.yml,正如官方 Docker for Beginners Ch.3 中使用的那样:Deploying an app to a Swarm
    2. 使用docker-cloud.yml,就像在Docker Cloud Stack YML reference 中用于Docker 云服务一样。
    3. 使用 docker-compose.yml -- Compose 文件格式的旧默认名称。

【讨论】:

  • 不错的概述:-)。我觉得 Compose 文件参考文档中包含不适用于 (Docker-) Compose 的条目有点烦人:- P
  • @KajMagnus 我同意,应该有一个过滤器来仅查看您在任一场景中可用的选项。
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 2021-05-10
  • 2016-01-19
  • 2015-01-15
  • 2011-11-20
  • 2014-07-13
  • 2020-10-24
  • 2020-08-19
相关资源
最近更新 更多