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

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

我正在尝试了解 Docker-ComposeDocker-Swarm[=37= 之间的区别或相似之处].

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

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

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

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

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

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

我有点糊涂了???

非常感谢!

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

你是对的docker-compose 是为了启动多容器应用程序。之前您曾经执行 docker run .. 来启动每个容器。通常采用微服务范式的现代应用程序可以由几十个服务组成,使用 docker run .. 很快就会变得非常乏味。因此 docker-compose 允许您将所有容器及其属性以及它们如何相互连接表示为 yamljson 文件,以便您可以更轻松地管理它。

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

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

Swarm 是 docker 中的调度组件。什么是调度 - 它只不过是弄清楚 "place" 容器在 docker 主机集群中的位置。您可以拥有数百台服务器的集群,也可以拥有数百个容器,每个容器都封装了针对十几个不同应用程序的服务。现在这些容器应该如何分布在你的数百台服务器的集群中,一些容器是否应该只放置在某些主机上因为它们满足特定的标准或者它们应该更接近(或不接近)以某种方式相关的其他容器......所有这些都是由 docker Swarm 执行的调度组件的一部分。

我建议您在此处阅读有关 docker.com 的入门文档:https://docs.docker.com/engine/getstarted-voting-app/

compose or swarm or swarm overlay networks

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

我特意将 swarm 和 swarm overlay 网络分开,因为你不需要同时使用两者,但是如果下面没有 swarm 就无法获得覆盖网络。

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

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

我希望澄清。

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

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

  • 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引擎。这些需要 key/value 存储来维护它们的状态。 Swarm 模式提供了这一点,但如果禁用了 Swarm 模式,您也可以使用 etcd、consul 或 zookeeper。
  • links:一种将容器连接在一起的方法,早于桥接网络。不再推荐使用它。
  • classic swarm:作为容器运行的集成 swarm 模式的前身,允许多个引擎作为一个引擎出现,但不提供编排或包含自己的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-自我组合。 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.

从命令行执行此操作

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