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


82

我试图了解Docker-ComposeDocker-Swarm之间的差异或相似之处。

通过阅读文档,我了解到docker-compose提供了一种将不同容器绑定在一起并在单个服务中协同工作的机制(我猜它使用的功能与--link命令用于链接两个容器的功能相同)

另外,我对docker-swarm的理解是,它允许您管理不同docker-host的集群,每个集群都在运行某些docker-images的多个容器实例。我们可以将连接定义为群集中不同容器之间的覆盖网络(即使它们跨越群集中的两个docker-hosts)以将它们作为一个单元进行连接。

我想了解的是docker-swarm成功的docker-compose和overlay网络是连接容器的新方法(推荐)吗?

还是docker-compose仍然是整个docker系列的组成部分,并且期望并建议使用它来连接容器以进行协作。如果是这样,docker-compose是否可以与群集中不同节点上的容器一起使用?

还是覆盖网络用于在群集中的不同主机之间连接容器,而docker-compose用于创建内部链接?

此外,我还看到docker文档中提到了--links不再被推荐,并且很快就会过时。

我有点困惑???

非常感谢!


9
没有答案能解决您的问题吗?如果是这样,则选中复选框以接受其中之一作为您的答案。
JoeG

Answers:


102

从一些定义开始可能会有所帮助:

  • docker-compose:用于配置和管理一组相关容器的命令。它是docker cli使用的相同api的前端,因此您可以使用像这样的命令来重现它的行为docker run
  • docker-compose.yml:一组容器的定义文件,由docker-compose使用,现在也由swarm模式使用。
  • swarm模式:用于将一组docker引擎作为一个实体进行管理并提供编排(不断尝试纠正当前状态和目标状态之间的任何差异)。
  • service:一个或多个容器用于群集内相同的图像和配置,多个容器可提供可伸缩性。
  • stack:集群中的一项或多项服务,可以使用DAB或docker-compose.yml文件定义这些服务。
  • 网桥网络:由单个docker引擎管理的网络,其中多个容器可以相互通信。您可能有一个引擎管理多个网络,并且容器可以连接到零个或多个网络。
  • 覆盖网络:类似于网桥网络,但跨越多个docker引擎。这些需要键/值存储来维持其状态。群集模式提供了此功能,但是如果禁用了群集模式,则还可以使用etcd,consul或zookeeper。
  • links:一种在桥接网络之前将容器连接在一起的方法。不再建议使用它。
  • 经典群:作为容器运行的集成群模式的前身,允许多个引擎作为一个整体出现,但不提供编排或包括其自己的k / v存储。

回答问题:

docker-swarm成功的docker-compose和overlay网络是否是连接容器的新(推荐)方法?

还是docker-compose仍然是整个docker系列的组成部分,并且期望并建议使用它来连接容器以进行协作。如果是这样,docker-compose是否可以与群集中不同节点上的容器一起使用?

它们提供不同的功能,并且将继续发挥作用。docker-compose无法在swarm模式下启动容器,但是可以使用更新版本的docker-compose.yml文件(版本3)直接在swarm模式下定义堆栈,而无需使用docker-compose本身。需要docker-compose来在群集模式之外,在单个docker引擎上或在经典群集中管理容器。

还是覆盖网络用于在群集中的不同主机之间连接容器,而docker-compose用于创建内部链接?

此外,我还看到docker文档中提到了--links不再被推荐,并且很快就会过时。

从yml文件的版本2开始的docker-compose默认情况下将多个容器连接在一起,并且每个项目都有一个新的桥接网络(该项目默认为目录名称)。使用经典群集时,默认情况下将使用外部k / v存储区来覆盖网络。而且,采用群集模式堆栈,这将是一个覆盖网络。

使用docker网络是使容器相互通信的首选方法。您希望每组容器要与其他Docker环境隔离的网络。docker-compose会自动执行此网络创建,但是您也可以从命令行使用来完成docker networks create

具有内置DNS发现功能的docker网络已很大程度上取代了链接。从docker-compose.yml中删除链接时,您可能需要将其替换为一个depends_on部分以强制执行容器启动顺序。否则,只有极少数情况下链接有意义,而我所看到的所有用法都是来自过时文档的人。


3
这是有帮助的。您能定义DAB一下吗?
马修·詹姆斯·布里格斯

3
DAB是一种实验性文件格式,从未受到关注。现在基本上是v3 docker-compose.yml文件。docs.docker.com/compose/bundles/#bundle-file-format
BMitch

22

组成或群集或群集覆盖网络

如果您在笔记本电脑上进行演示以外的其他操作,您会发现需要使用以上所有内容。

我故意将群集和群集覆盖网络分开,因为您无需同时使用两者,但是如果没有群集下面的网络,就无法获得覆盖网络。

Compose用于将多个容器放在一起。现在,尽管它们可能没有关联,但它们相互关联才有意义。但是,让我们假设一个典型的情况,即容器用于相互关联的服务,那么您希望它们以某种方式相互通信,但又要控制它们如何使用网络相互通信。例如,以一个具有Web服务器,appserver和db的3层应用程序为例。假设所有三个组件都已被docker化,而您正在使用compose将它们放在一起而不是运行docker run..分别使用不同的参数重复3次,等等。这三个都会出现,但是您需要控制它们之间的连接方式。您希望网络服务器能够与应用服务器对话,但不能直接与数据库对话。您可能希望appserver与数据库服务器容器进行对话(ping),也对Web服务器进行ping。所有连接都是两种方式,但仅限于您希望能够相互通信的那些服务。对于这种安排,您通常会设置2个网络-sayfrontendbackend。Web和应用程序容器已连接到前端网络。应用程序和数据库容器已连接到后端网络。因为db和Web容器之间没有公共网络,所以它们不能相互接触(ping),这是您的意图。

现在,如果您希望这3种服务能够在100台计算机的群集上运行,并且还希望在它们之间进行扩展,则将需要一个跨越多个主机的网络。那就是覆盖网络(成群)出现的地方。重叠网络不过是基于VxLAN技术构建的多主机网络。您不必了解VxLAN,除了它是几乎所有现代网络基础结构都支持的标准网络拓扑之外。

我希望这可以澄清。

编辑:我没有看到您已经得到答案!


1
谢谢@Anoop。因此,如果我说compose和swarm都使用基于.yaml的服务描述来启动服务,并且都使用创建的用户定义网络来连接这些服务,那我猜对了。唯一的区别是compose用于在单个docker-host上运行的一组容器,而swarm用于多主机平台。
Shabirmean

是的,但是您可以混合使用,这意味着-您可以使用相同的撰写文件来针对群集集群而不是单个Docker主机。这样非常灵活。
Anoop

8

我认为您对每个元素都有正确的理解,但是需要一些调整。

您是正确的docker-compose是要启动多容器应用程序。之前您曾经做过docker run ..启动每个容器的操作。通常,包含微服务范式的现代应用程序可以由数十种服务组成,并且使用docker run ..很快就会变得很累人。因此,docker-compose允许您表达所有容器及其属性以及它们如何作为一个yamljson文件相互连接,以便您可以更轻松地对其进行管理。

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

链接是不同的,他们只是搬运工,撰写或一部分docker run命令和赞成不赞成使用software defined networks它的overlay networks只是其中之一。

Swarm是docker中的调度组件。计划是什么-只是弄清楚将容器“放置”在Docker主机群集中的位置。您可以拥有数百个服务器的群集,并且可能具有数百个容器,每个容器封装了针对十二种不同应用程序的服务。现在这些容器应该如何分布在数百个服务器的群集中,应该将某些容器仅放置在某些主机上,因为它们满足特定条件,或者应该更靠近(或不应该)与某种相关的其他容器...所有这些都是由Docker Swarm执行的调度组件的一部分。

我建议您在docker.com上浏览入门文档:https://docs.docker.com/engine/getstarted-voting-app/


非常感谢你。我已经完成了该教程。我试图弄清楚docker开发人员本身是否建议使用什么来连接紧密相关的容器-组成群集覆盖网络。我所面临的困境是,通过网络连接容器的想法似乎与通过诸如compose之类的容器连接(或者它们是相同的??)不一样。像容器绑定这样的组合比覆盖网络样式的连接更安全吗?
Shabirmean
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.