一个堆栈文件和Compose文件有什么区别?

86

我正在学习使用Docker Compose在多个主机上部署应用程序的方法。我发现有两个配置文件 - stack文件和Compose文件。

Cloud stack文件YAML参考中,它说明 stack文件是一个以YAML格式定义一个或多个服务的文件,类似于docker-compose.yml文件但具有一些扩展功能。

而从这篇文章中,它指出stack和docker-compose非常相似,但它们定义服务,而docker-compose定义容器

它们看起来非常相似,因此我想知道何时使用stack文件,何时使用Compose文件?


1
好问题。我也想问为什么我们已经有了docker compose,还需要Docker stack呢?在第二个链接中,它指出docker stack是一个针对docker引擎的服务,而docker compose不是。那么,为什么我们不能升级docker compose并将其变成一个服务呢? - Dustin Sun
1
@lonelyloner 很好的问题,我的猜测是因为docker-compose是一种独立的工具,它并没有集成到docker中。在Linux上,我不得不单独安装它,而在Windows上,我相信它与Docker一起提供。希望在未来,docker会将它们合并,只有一个堆栈文件。 - Roman Mik
2个回答

81
概念上,这两个文件都有同样的目的——在Docker引擎上部署和配置您的容器。
Docker-compose工具是最先创建的,其目的是在单个Docker引擎上“定义和运行多容器Docker应用程序”。(请参阅docker compose overview
您可以使用docker-compose up来创建/更新您的容器、网络、卷等等。
而在Docker Swarm(Docker的编排和调度工具)中使用,因此它具有额外的配置参数(即副本、部署、角色),这些参数在单个Docker引擎上不需要。
堆栈文件由docker stack命令解释。此命令只能从Docker Swarm管理器调用。
您可以将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/,可以帮助理解差异。


1
是的,这让我感到困惑,因为Compose文件还提到了与Swarm相关的属性,例如deploy,但当您使用docker compose时会被忽略,在docker stack deploy中才会生效。我猜,就所有目的而言,对于Compose的3+版本,它们是相同的? - dayuloli
版本3与2不同,但并不是很多。值得注意的是声明卷的方式。还有其他一些改变。版本3的组合应该能够在集群上无需更改即可运行,但实际上您可能需要添加集群配置,特别是如果您的容器具有卷并且无法承受其数据在重新部署时丢失。 - Roman Mik
8
@sudo "docker stack" 只能在 Docker Swarm 上使用。docker-compose 是 dock 的附加组件,用于在单个 docker 引擎上协调服务。Docker stack 是 docker-compose 的产物。希望未来它们会合并在一起,只保留 docker stack。 - Roman Mik
1
仅作为对此答案的评论,Docker Compose可以构建、拉取和更新它使用的映像,而Docker Stack则不能。您还需要将单引擎/机器docker实例转换为群集,然后才能将您的docker-compose.yml文件与Docker Stack一起使用;一些属性可能会被忽略,但假定yaml使用3.x版本;它可以互换地使用。因此,总体而言;docker-compose更适合开发,而docker stack更适合预构建了所有内容的部署目的。 - Rik

23

注意:本问题猜测Docker Cloud参考资料是理解stack的首选,确实很有用,但那不是关于stack与compose的权威来源——相反,那是一个特定于Docker托管服务的指南:“Docker Cloud提供具有构建和测试设施的托管注册表服务。” 有关文件文档,请参见Compose文件版本3格式 - 尽管它被命名为“Compose”,但这是哪些功能适用于compose和swarm/stack以及如何使用的权威位置。

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

  1. Docker Compose(docker-compose up
  2. Docker Swarm(docker swarm init; docker stack deploy --compose-file docker-stack.yml mystack

两种方式均采用Docker Compose文件版本3格式编写的YAML文件。该参考资料是记录docker-compose和docker swarm / stack配置的主要来源。

然而,在两个yml文件中,您可以执行特定的操作——特定的选项和特定的命名约定存在着特定的区别:

选项

可用的服务配置选项在Compose文件参考页面中有文档记录--通常在选项条目底部会有一个注释,描述它被docker stack deploydocker-compose up忽略。

例如,在使用(版本3)Compose文件部署堆栈时,以下选项在swarm模式下被忽略

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一起使用,例如:

deploy、restart_policy

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

Ignoring unsupported options: links

文件命名

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

  • 对于docker stack deploy命令,在docker stack deploy reference中没有给出默认文件。你可以使用任何名称,但以下是三种惯例:

    1. 使用docker-stack.yml,就像在官方Docker for Beginners Ch.3中所使用的一样:部署应用程序到Swarm
    2. 使用docker-cloud.yml,就像在Docker Cloud服务的Docker Cloud Stack YML reference中所使用的一样。
    3. 使用docker-compose.yml -- Compose文件格式的旧默认名称。

4
好的概述 :- )。我发现Compose文件参考文档中有一些条目在(Docker-) Compose中无法使用,这让我有点烦恼 :-P。 - KajMagnus
1
@KajMagnus 我同意,应该有一个筛选器,只查看你在任一情况下可用的选项。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接