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

When to use Docker-Compose and when to use Docker-Swarm

我试图理解D-compose和D-swarm之间的区别或相似之处。

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

另外,我对Docker Swarm的理解是,它允许您管理不同Docker主机的集群,每个主机都运行一些Docker映像的容器实例。我们可以将连接定义为群中不同容器之间的重叠网络(即使它们跨越群中的两个Docker主机),以将它们作为一个单元进行连接。

我想了解的是,Docker Swarm是否成功地构建了Docker,覆盖网络是连接容器的新(推荐)方法?

或者说docker compose仍然是整个docker系列的一个组成部分,使用它来连接容器以进行协作是值得期待和建议的。如果是这样,docker compose是否可以跨群中的不同节点使用容器??

或者,覆盖网络是用于连接Swarm中不同主机上的容器,Docker Compose是用于创建内部链接的??

除此之外,我还看到Docker文档中提到——不再推荐链接,很快就会过时。

我有点困惑????

谢谢!


从以下几个定义开始可能会有所帮助:

  • docker compose:用于配置和管理一组相关容器的命令。它是docker cli使用的相同API的前端,因此您可以使用docker run之类的命令来重现它的行为。
  • docker-compose.yml:一组容器的定义文件,由docker-compose使用,现在也由swarm模式使用。
  • Swarm模式:用于将一组Docker引擎作为单个实体进行管理,并提供协调(不断尝试纠正当前状态和目标状态之间的任何差异)。
  • 服务:一个或多个容器在Swarm中用于相同的图像和配置,多个容器提供可扩展性。
  • 堆栈:群中的一个或多个服务,可以使用DAB或docker-compose.yml文件定义这些服务。
  • 桥接网络:由一个Docker引擎管理的网络,其中多个容器可以相互通信。引擎可能管理多个网络,容器可以连接到零个或多个网络。
  • 覆盖网络:类似于桥接网络,但跨越多个Docker引擎。它们需要一个键/值存储来维护它们的状态。Swarm模式提供了这一点,但是如果禁用了Swarm模式,您也可以使用ETCD、Consul或ZooKeeper。
  • 链接:在桥接网络之前将容器连接在一起的方法。不再推荐使用它。
  • 经典蜂群:集成蜂群模式的前身,作为一个容器运行,允许多个引擎作为一个引擎出现,但不提供协调或包括自己的K/V商店。

回答问题:

has docker-swarm succeeded docker-compose and overlay networks is the new (recommended) way to connect containers?

Or is it that docker-compose is still an integral part of the entire docker family and it is expected and advisable to use it to connect containers to work in collaboration. If so does docker-compose work with containers across different nodes in the swarm??

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

Or is it that overlay networks is for connecting containers across different hosts in the swarm and docker-compose is for creating internal links??

Besides I also see that it is mentioned in the docker documentation that --links not recommended anymore and will be obsolete soon.

docker compose从yml文件的版本2开始,默认情况下会将多个容器与每个项目的新桥接网络连接在一起(项目默认为目录名)。对于经典的Swarm,这将默认为使用外部K/V存储的覆盖网络。使用一个群模式栈,这将是一个覆盖网络。

使用Docker网络是让容器彼此通信的首选方式。您希望每个容器组都有一个网络,以便与Docker环境的其余部分隔离。docker compose可以自动创建这个网络,但您也可以使用docker networks create从命令行进行创建。

链接已经被内置DNS发现的Docker网络所取代。从docker-compose.yml中删除链接时,可能需要用depends_on节替换链接,以强制执行容器启动顺序。否则,很少有场景中链接是有意义的,我所看到的所有用法都来自于遵循过时文档的人。


compose or swarm or swarm overlay networks

如果你在笔记本电脑上做演示以外的事情,你会发现你需要使用上述所有功能。

我故意将swarm&swarm覆盖网络分开,因为您不需要同时使用这两种网络,但如果没有下面的群,就无法获得覆盖网络。

组合用于将多个容器组合在一起。现在,他们之间是有关系的,虽然他们可能不是。但是让我们假设一个典型的例子,当容器用于彼此相关的服务时,那么您希望它们以某种方式相互交谈,但同时控制它们如何通过网络相互交谈。例如,采用具有Web服务器、AppServer和DB的三层应用程序。假设所有三个组件都是docterized,并且您使用compose将它们放在一起,而不是使用不同参数运行docker run..三次等。所有三个组件都会出现,但您希望控制它们之间的连接方式。您希望Web服务器能够与AppServer通信,但不能直接与DB通信。您还希望AppServer能够与DB服务器容器进行对话(ping),并对Web服务器进行ping。所有连接都是双向的,但仅限于那些您希望能够相互通信的服务。对于这种安排,您通常会设置2个网络,例如frontendbackend。Web和应用程序容器连接到前端网络。应用程序和数据库容器连接到后端网络。因为数据库和Web容器之间没有公共网络,所以它们不能互相接触(ping),这是您的目的。

现在,如果您希望这3个服务能够在100台机器的集群上运行,并且您还希望在它们之间进行扩展,那么您将需要跨多个主机的网络。这就是叠加网络(在Swarm中)出现的地方。覆盖网络只是基于VXLAN技术构建的多主机网络。您不必了解VXLAN,只需知道它是一种标准的网络拓扑结构,几乎所有现代网络基础设施都支持它。

希望能澄清。

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


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

正确的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/