我试图了解 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 不再推荐,并且很快就会过时。
我有点糊涂???
多谢!
从一些定义开始可能会有所帮助:
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
部分以强制执行容器启动顺序。否则,很少有链接是有意义的场景,我看到的所有用法都是来自遵循过时文档的人。
组合或集群或集群覆盖网络
如果您在笔记本电脑上做演示以外的任何事情,您会发现您需要使用上述所有内容。
我故意将 swarm 和 swarm 覆盖网络分开,因为你不需要同时使用这两种网络,但是如果没有一个 swarm,你就无法获得覆盖网络。
Compose 用于将多个容器组合在一起。现在,它们彼此相关是有道理的,尽管它们可能不相关。但是让我们假设一个典型的情况,当容器用于相互关联的服务时,您会希望它们以某种方式相互通信,但又要控制它们如何使用网络相互通信。例如,采用具有 webserver、appserver 和 db 的 3 层应用程序。假设所有三个组件都是 dockerized,并且您正在使用 compose 将它们放在一起,而不是使用不同的参数等运行 docker run..
三次。所有三个都会出现,但您希望控制它们如何相互连接。您希望网络服务器能够与应用服务器通信,但不能直接与数据库通信。并且您希望应用服务器与 db 服务器容器对话(ping)并 ping Web 服务器。所有连接都是双向的,但仅限于您希望能够相互通信的那些服务。对于这样的安排,您通常会设置 2 个网络 - 例如 frontend
和 backend
。 Web 和应用程序容器连接到前端网络。 app 和 db 容器连接到后端网络。因为 db 和 web 容器之间没有公共网络,所以它们不能相互接触(ping),这是您的意图。
现在,如果您希望这 3 个服务能够在由 100 台机器组成的集群上运行,并且还希望在它们之间进行扩展,那么您将需要一个跨越多个主机的网络。这就是覆盖网络(在群中)出现的地方。覆盖网络不过是基于 VxLAN 技术构建的多主机网络。您不必了解 VxLAN,除了它是几乎所有现代网络基础设施都支持的标准网络拓扑。
我希望澄清。
编辑:我没有看到你已经得到了答案!
我认为您对每个内容的大部分理解都是正确的,但是需要进行一些调整。
你是正确的 docker-compose 是为了调出多容器应用程序。之前您使用 docker run ..
来启动每个容器。通常,采用微服务范式的现代应用程序可以由数十个服务组成,使用 docker run ..
很快就会变得非常厌烦。因此 docker-compose 允许您将所有容器及其属性以及它们如何相互连接为 yaml
或 json
文件,以便您可以更轻松地管理它。
因此,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/
DAB
?