何时使用Docker-Compose以及何时使用Docker-Swarm

Sha*_*ean 63 docker docker-compose docker-swarm docker-swarm-mode

我试图理解D-ComposeD-Swarm之间的差异或相似之处.

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

另外,我对docker-swarm的理解是它允许你管理不同docker-hosts的集群,每个docker-hosts都运行一些docker-images的几个容器实例.我们可以将连接定义为群中不同容器之间的覆盖网络(即使它们跨越群中的两个泊坞主机)将它们作为一个单元连接起来.

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

或者,docker-compose仍然是整个docker系列中不可或缺的一部分,并且可以使用它来连接容器以协同工作.如果是这样,docker-compose在群中的不同节点上使用容器?

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

此外,我还看到在docker文档中提到 -不再推荐链接,很快就会过时.

我有点困惑???

非常感谢!

BMi*_*tch 81

它可能有助于从一些定义开始:

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

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

此外,我还看到在docker文档中提到 - 不再推荐链接,很快就会过时.

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

使用docker networks是让容器相互通信的首选方式.您希望每组容器都有一个网络,希望与其余的docker环境隔离.docker-compose可自动执行此网络创建,但您也可以从命令行执行此操作docker networks create.

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

  • DAB是一种实验性文件格式,从未受到关注。现在基本上是v3 docker-compose.yml文件。https://docs.docker.com/compose/bundles/#bundle-file-format (3认同)
  • 这是有帮助的。您能定义一下“ DAB”吗? (2认同)

Ano*_*oop 14

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

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

我故意将swarm和swarm覆盖网络分开,因为你不需要同时使用它们,但如果没有一个swarm,你就无法获得覆盖网络.

撰写是为了将多个容器组合在一起.现在它们彼此相关是有意义的,尽管它们可能不相关.但是,假设一个典型的情况是容器用于彼此相关的服务,那么你希望它们以某种方式相互通信,但是控制它们如何使用网络相互通信.例如,采用具有Web服务器,appserver和db的3层应用程序.假设所有三个组件都是docker化的,你使用compose将它们组合在一起而不是docker run..用不同的参数运行三次等.所有三个组件都会出现,但是你想控制它们如何相互连接.您希望Web服务器能够与应用程序服务器通信,而不是直接与数据库通信.并且您希望appserver与数据库服务器容器通话(ping)并ping Web服务器.所有连接都是双向的,但仅限于您希望能够相互通信的那些服务.对于这样的安排,你通常会设置2个网络 - 比如说frontendbackend.Web和app容器连接到前端网络.app和db容器连接到后端网络.因为db和web容器之间没有公共网络,所以它们不能互相触摸(ping),这是你的意图.

现在,如果您希望这3个服务能够在100个计算机的集群上运行,并且您还希望跨越它们进行扩展,则需要跨越多个主机的网络.这就是覆盖网络(群集)出现的情况.覆盖网络只不过是通过VxLAN技术构建的多主机网络.您不必了解VxLAN,除了它是几乎所有现代网络基础架构都支持的标准网络拓扑.

我希望澄清一下.

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

  • 谢谢@Anoop。所以我想如果我说 compose 和 swarm 都使用基于 **.yaml** 的服务描述来启动服务,并且都使用创建的用户定义网络来连接这些服务,那么我想这是正确的。唯一的区别是 compose 适用于在单个 docker-host 上运行的一组容器,而 swarm 适用于多主机平台。 (2认同)

Ano*_*oop 6

我认为您对每种含义都有大多数正确的理解,但是需要进行一些调整。

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

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

链接是不同的,它们只是docker-compose或docker run命令的一部分,不建议使用software defined networks,而overlay networks只是其中之一。

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

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