ChatGPT解决这个技术问题 Extra ChatGPT

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

我试图了解 Docker-Compose 和 Docker-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 不再推荐,并且很快就会过时。

我有点糊涂???

多谢!

没有一个答案能解决您的问题吗?如果有,请选中复选框以接受其中一个作为您的答案。

C
Community

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

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。

链接:一种将容器连接在一起的方法,早于桥接网络。不再推荐使用它。

经典 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 部分以强制执行容器启动顺序。否则,很少有链接是有意义的场景,我看到的所有用法都是来自遵循过时文档的人。


这很有帮助。您能否定义DAB
DAB 是一种实验性文件格式,从未受到关注。它现在基本上是一个 v3 docker-compose.yml 文件。 docs.docker.com/compose/bundles/#bundle-file-format
A
Anoop

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

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

我故意将 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,除了它是几乎所有现代网络基础设施都支持的标准网络拓扑。

我希望澄清。

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


谢谢@Anoop。所以我想如果我说 compose 和 swarm 都使用基于 .yaml 的服务描述来启动服务并且都使用创建的用户定义的网络来连接这些服务是正确的。唯一不同的是,compose 适用于在单个 docker-host 上运行的一组容器,而 swarm 适用于多主机平台。
是的,但是您可以混合搭配,这意味着 - 您可以使用相同的 compose 文件来定位 swarm 集群而不是单个 docker 主机。这种方式非常灵活。
A
Anoop

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

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


非常感谢您。我已经完成了那个教程。我试图弄清楚 docker 开发人员本身是否有关于需要使用什么来连接密切相关的容器的具体建议 - 组合或群覆盖网络。我的困境是,通过网络连接容器的想法似乎与通过 compose 连接它们的想法不同(或者它们是否相同???)。是否像容器绑定一样组合比覆盖网络样式连接更安全?