何时使用Docker-Compose,何时使用Docker-Swarm

108
我正在尝试理解Docker-Compose和Docker-Swarm之间的区别或相似之处。
通过阅读文档,我了解到docker-compose提供了一种机制来将不同的容器绑定在一起并协同工作,作为单个服务(我猜测它使用与链接两个容器使用的--link命令相同的功能)。
此外,我对docker-swarm的理解是它允许您管理不同docker-hosts的群集,每个docker-host运行某些docker-images的多个容器实例。我们可以将不同容器之间的连接定义为叠加网络,在集群中跨越两个docker-hosts连接它们作为一个单元。
我想要理解的是,docker-swarm是否已成功取代了docker-compose,并且叠加网络是连接容器的新(推荐)方法?
还是说docker-compose仍然是整个docker家族的重要组成部分,预计并建议使用它来连接容器以协同工作?如果是这样的话,docker-compose是否可以与集群中不同节点上的容器一起使用?
另外,我还看到在docker文档中提到--links不再推荐使用,并且很快将过时。
我有点困惑???
非常感谢!

14
没有任何答案回答了你的问题吗?如果有,请选择复选框将其中一个作为你的答案接受。 - JoeG
3个回答

130
首先,以下是一些定义:
  • docker-compose:用于配置和管理相关容器组的命令。它是docker cli使用的相同API的前端,因此您可以使用类似docker run的命令来复制其行为。
  • docker-compose.yml:由docker-compose使用的容器组定义文件,现在也被swarm mode使用。
  • swarm mode:用于将一组docker引擎作为单个实体进行管理并提供编排功能(不断尝试纠正当前状态和目标状态之间的任何差异)。
  • service:在swarm中为相同镜像和配置提供一个或多个容器,多个容器提供可扩展性。
  • stack:在swarm内的一个或多个服务,可以使用DAB或docker-compose.yml文件定义。
  • bridge network:由单个docker引擎管理的网络,其中多个容器可以彼此通信。您可以通过一个引擎管理多个网络,并且容器可以附加到零个或多个网络。
  • overlay network:类似于桥接网络,但跨越多个docker引擎。这些需要键/值存储来维护其状态。Swarm mode提供了这一点,但如果禁用了swarm mode,则也可以使用etcd、consul或zookeeper。
  • links:一种连接容器的方法,早于桥接网络。不再建议使用它。
  • classic swarm:集成swarm mode的前身,作为一个容器运行,允许多个引擎出现为一个,但不提供编排或包含自己的k/v存储。
回答问题: Docker Swarm并没有取代Docker Compose和Overlay Network作为连接容器的新(推荐)方式。实际上,Docker Compose仍然是整个Docker家族中的重要部分,并且预计并建议使用它来将容器连接起来协同工作。而且,Docker Compose可以与Swarm中不同节点上的容器一起工作。另外,Overlay network提供了跨越多个Docker引擎的连接容器的一种有效方式。它们提供不同的功能,并将继续服务于各自的目的。 docker-compose 无法在 swarm 模式下启动容器,但可以使用较新版本的 docker-compose.yml 文件(版本 3)直接在 swarm 模式下定义堆栈,而无需使用 docker-compose 本身。 docker-compose 需要用于管理容器,但在单个 Docker 引擎或经典 Swarm 上工作时,无法在 Swarm 模式之外启动容器。
另外,我也看到在 Docker 文档中提到 --links 不再推荐使用,很快将被取消。
从 docker-compose 的 yml 文件版本 2 开始,默认情况下会使用一个新的桥接网络连接多个容器(项目默认为目录名称)。 在经典 Swarm 中,这将默认使用使用外部 k/v 存储的覆盖网络。 而在 Swarm 模式堆栈中,则是使用覆盖网络。
使用 Docker 网络是让容器相互通信的首选方式。 您希望每组容器都有一个网络,以便将其与您的 Docker 环境中的其他内容隔离开来。 docker-compose 可以自动化此网络创建,但您也可以使用 docker networks create 命令行进行操作。
链接已被 Docker 网络替代,并具有内置的 DNS 发现功能。 当您从 docker-compose.yml 中删除链接时,可能需要通过 depends_on 部分替换它们,以强制执行容器的启动顺序。 否则,使用链接的场景非常少,我见过的所有用法都是因为有人在遵循过时的文档。

4
有帮助。您能否定义“DAB”? - Matthew James Briggs
5
DAB是一种实验性的文件格式,从未得到广泛应用。现在它基本上相当于v3 docker-compose.yml文件。详情请参阅https://docs.docker.com/compose/bundles/#bundle-file-format - BMitch
现在Docker直接支持compose,假设我只有一个大型节点(永远不会集群),还有什么理由继续使用Swarm吗? - spinkus

34
组合,集群或集群覆盖网络
如果您不仅仅是在笔记本电脑上演示,那么您会发现需要使用以上所有内容。我特意将swarm和swarm overlay网络分开,因为您不必同时使用两者,但是您不能在没有swarm的情况下获得overlay网络。
Compose用于一起启动多个容器。现在它们彼此相关是有意义的,尽管它们可能并不相关。但是假设容器是为相互关联的服务设计的,那么您希望它们以某种方式相互通信,但通过网络控制它们如何相互通信。例如,考虑一个具有Web服务器,应用程序服务器和数据库的3层应用程序。假设所有三个组件都已经Docker化,并且您正在使用Compose将它们一起启动,而不是使用不同参数运行docker run.. 三次等等。所有都会启动,但您想控制它们如何连接到彼此。您希望Web服务器能够与应用程序服务器交谈,但不能直接与数据库交谈。您还希望应用程序服务器与数据库服务器容器进行通信(ping),并且也要ping Web服务器。 所有连接都是双向的,但仅限于您希望能够相互通信的那些服务。对于这种排列,通常会设置2个网络-例如frontendbackend。Web和应用程序容器连接到前端网络。应用程序和数据库容器连接到后端网络。由于没有公共网络连接数据库和Web容器,因此它们不能彼此触及(ping),这是您的意图。
现在,如果您希望这三个服务能够在您的100多台机器集群上运行,并且还希望跨它们进行扩展,则需要一个跨越多个主机的网络。这就是覆盖网络(在swarm中)的作用。覆盖网络只是建立在VxLAN技术之上的多主机网络。您不必了解VxLAN,除非它是几乎所有现代网络基础架构都支持的标准网络拓扑结构。我希望这样解释清楚了。 编辑:我没有看到你已经得到了答案!

2
谢谢@Anoop。那么我猜如果我说compose和swarm都使用基于**.yaml**的服务描述来启动服务,并且两者都使用创建的用户定义网络来连接这些服务,那就是正确的。唯一的区别是,compose用于在单个Docker主机上运行一组容器,而swarm用于多个主机平台。 - Shabirmean
1
是的,但你可以混合和匹配,这意味着 - 你可以使用相同的组合文件来针对一个Swarm集群而不是单个Docker主机。这样非常灵活。 - Anoop

12

我认为你对每个组件的理解大部分是正确的,但需要做出一些调整。

docker-compose确实用于启动多容器应用程序。之前,您需要使用docker run...来启动每个容器。通常采用微服务范例的现代应用程序可以由数十个服务组成,使用docker run...很快就会变得非常繁琐。因此,docker-compose允许您以yamljson文件的形式表达所有容器及其属性以及它们之间的连接,以便您可以更轻松地管理它。

因此,docker-compose是docker生态系统中的容器编排组件。

链接是不同的,它们只是docker-compose或docker run命令的一部分,并已被弃用,推荐使用“软件定义网络”,其中overlay networks只是其中之一。

Swarm是docker中的调度组件。什么是调度--它只是找出在docker主机集群中“放置”容器的位置。您可以拥有数百台服务器的集群,您可能有数百个容器,每个容器封装为十几个不同应用程序的服务。现在这些容器应该如何分布在数百台服务器上,某些容器是否应仅放置在某些主机上,因为它们满足特定条件,或者它们是否应该与其他某些相关容器靠近(或不接近)......所有这些都是调度组件的一部分,由docker Swarm执行。

我建议您阅读docker.com上的入门文档:https://docs.docker.com/engine/getstarted-voting-app/


1
非常感谢。我已经完成了那个教程。我正试图弄清楚是否有一个特定的建议来自 Docker 开发者本身,关于需要使用什么来连接密切相关的容器 - compose 还是 swarm overlay 网络。我的困境在于,通过 network 连接容器的想法似乎不同于通过类似 compose 的方式连接它们(或者它们是相同的吗?)。难道像容器绑定一样的 compose 更安全,而覆盖网络风格的连接则不是这样吗? - Shabirmean

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