95

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

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

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

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

还是说 docker-compose 仍然是整个 docker 家族中不可或缺的一部分,并且可以使用它来连接容器以协同工作。如果是这样,docker-compose 是否可以与 swarm 中不同节点的容器一起使用?

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

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

我有点糊涂???

多谢!

4

3 回答 3

116

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

  • 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。
  • 链接:一种将容器连接在一起的方法,早于桥接网络。不再推荐使用它。
  • 经典 swarm:作为容器运行的集成 swarm 模式的前身,允许多个引擎作为一个引擎出现,但不提供编排或包含自己的 k/v 存储。

要回答问题:

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

还是说 docker-compose 仍然是整个 docker 家族中不可分割的一部分,使用它来连接容器以协同工作是值得期待和可取的。如果是这样,docker-compose 是否可以与 swarm 中不同节点的容器一起使用?

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

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

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

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

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

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

于 2017-03-03T23:04:25.667 回答
31

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

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

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

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

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

我希望澄清。

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

于 2017-03-03T20:54:35.780 回答
11

我认为您对每个内容的大部分理解都是正确的,但是需要进行一些调整。

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

于 2017-03-02T04:15:58.967 回答