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

我试图理解D-ComposeD-Swarm之间的区别或相似之处。

通过阅读文档,我了解到,docker-compose提供了一种机制来将不同的容器绑定在一起,并作为一个单独的服务进行协作(我猜测它使用了与链接两个容器的链接相同的function)

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

我想了解的是docker群成功docker组成和覆盖networking是新的(推荐)方式来连接容器?

或者是docker构成仍然是整个docker系列的一个组成部分,并且期望并且可以build议使用它来连接集装箱以便协同工作。 如果这样的话,docker-compose是否可以跨群集中的不同节点使用容器?

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

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

我有点困惑?

非常感谢!

这可能有助于从几个定义开始:

  • docker-compose :用于configuration和pipe理一组相关容器的命令。 它是docker cli使用的同一个api的前端,所以你可以用docker run这样的命令重现它的行为。
  • docker-compose.yml :一组容器的定义文件,由docker-compose使用,现在也用swarm模式。
  • swarm模式 :用于将一组docker引擎作为单个实体进行pipe理,并提供编排(不断尝试纠正当前状态与目标状态之间的差异)。
  • 服务 :一个或多个容器用于群集中相同的映像和configuration,多个容器提供可伸缩性。
  • 堆栈 :群中的一个或多个服务,可以使用DAB或docker-compose.yml文件来定义这些服务。
  • 桥网 :由多个容器可以相互通信的单个docker引擎pipe理的networking。 您可能有多个由引擎pipe理的networking,并且容器可以连接到零个或多个networking。
  • 覆盖networking :类似于网桥,但跨越多个docker引擎。 这些需要一个键/值存储来维持其状态。 Swarm模式提供了这个function,但是如果Swarm模式被禁用,你也可以使用etcd,consul或zookeeper。
  • 链接 :在桥接networking之前连接容器的方法。 其用法不再推荐。
  • 经典swarm :作为容器运行的集成swarm模式的前身,允许多个引擎一体出现,但不提供编排或包含自己的k / v存储。

回答问题:

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

或者是docker构成仍然是整个docker系列的一个组成部分,并且期望并且可以build议使用它来连接集装箱以便协同工作。 如果这样的话,docker-compose是否可以跨群集中的不同节点使用容器?

他们提供不同的function,并将继续为这个目的服务。 docker-compose无法在swarm模式下启动容器,但可以使用更新版本的docker-compose.yml文件(版本3)直接在群集模式下定义堆栈,而无需使用docker-compose自身。 docker-compose需要在群集模式之外,单个泊坞窗引擎或经典群集上pipe理容器。

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

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

docker-compose从yml文件的第2版开始,每个项目默认将多个容器连接到一个新的桥接networking(项目默认为目录名称)。 使用经典的swarm,默认为使用外部k / v存储的覆盖networking。 而使用群模式堆栈,这将是一个覆盖networking。

使用dockernetworking是让容器相互通信的首选方式。 你需要一个你希望与Docker环境其余部分隔离的每个容器组的networking。 docker-compose自动创build这个networking,但是你也可以通过docker networks create的命令行来完成。

链接已经在很大程度上被内置DNS发现的dockernetworking取代。 从docker-compose.yml中删除链接时,可能需要将其replace为depends_on节以执行容器启动顺序。 否则,有很less的情况下,链接是有道理的,我见过的所有用法都是来自过时的文档。

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

你是正确的docker构成是提出多容器应用程序。 之前你曾经做docker run ..启动每个容器。 通常,包含微服务范例的现代应用程序可以由几十个服务组成,并且使用docker run ..将很快变得非常烦人。 因此,docker-compose允许你expression所有容器及其属性,以及如何将它们作为yamljson文件相互连接,以便于以更简单的方式进行pipe理。

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

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

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

我build议你在这里通过docker.com上的入门文档: https ://docs.docker.com/engine/getstarted-voting-app/

组成或群或覆盖networking

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

我故意分离出了群体和群体的叠加networking,因为你不需要同时使用这两个networking,但是你不能在没有群体的情况下得到叠加networking。

撰写是为了将多个容器放在一起。 现在它们是相互关联的,尽pipe它们可能不是。 但是让我们假设一个典型的例子,当容器是相互关联的服务的时候,那么你希望他们以某种方式相互交谈,但是却要控制他们如何使用networking来相互交stream。 例如,采取一个3层的应用程序,有一个networking服务器,应用程序服务器和数据库。 假设所有这三个组件都是docker化的,而你正在使用compose把它们放在一起,而不是运行docker run..三次使用不同的参数等等。所有三个组件都会出现,但是你想控制它们如何相互连接。 您希望Web服务器能够与应用服务器通信,但不能直接与数据库通信。 你会希望应用程序服务器交谈(ping)数据库服务器容器,并pingnetworking服务器。 所有的连接都是双向的,但只限于那些你希望能够相互通信的服务。 对于这样的安排,你通常会设置2个networking – frontendbackend 。 Web和应用程序容器连接到前端networking。 应用程序和数据库容器连接到后端networking。 因为在db和web容器之间没有共同的networking,所以他们不能相互触摸(ping),这是你的意图。

现在,如果您希望这三种服务能够在100台机器的集群上运行,并且您还希望跨越这些服务进行扩展,则需要一个跨越多个主机的networking。 这就是覆盖networking(群体)的情况。 覆盖networking不过是通过VxLAN技术构build的多主机networking。 您不必了解VxLAN,只是它是几乎所有现代networking基础架构都支持的标准networking拓扑。

我希望澄清。

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