[英]When to use Docker-Compose and when to use Docker-Swarm
我试图了解Docker-Compose和Docker-Swarm之间的差异或相似之处。
通过阅读文档,我了解到 docker-compose 提供了一种将不同容器绑定在一起并作为单个服务协同工作的机制(我猜它使用与用于链接两个容器的--link命令相同的功能)
此外,我对 docker-swarm 的理解是,它允许您管理不同docker-hosts的集群,每个集群都运行一些 docker-images 的多个容器实例。 我们可以将连接定义为 swarm 中不同容器之间的覆盖网络(即使它们跨越 swarm 中的两个 docker-hosts)以将它们连接为一个单元。
我想了解的是 docker-swarm 是否成功了 docker-compose 和覆盖网络是连接容器的新(推荐)方式?
还是说 docker-compose 仍然是整个 docker 家族中不可或缺的一部分,使用它来连接容器以进行协作是预期和可取的。 如果是这样,docker-compose 是否可以与集群中不同节点的容器一起使用?
还是覆盖网络用于连接群中不同主机之间的容器,而 docker-compose 用于创建内部链接?
此外,我还看到docker文档中提到--links不再推荐并且很快就会过时。
我有点糊涂???
多谢!
从一些定义开始可能会有所帮助:
docker run
类的命令重现它的行为。回答问题:
docker-swarm 是否成功了 docker-compose 和覆盖网络是连接容器的新(推荐)方式吗?
还是说 docker-compose 仍然是整个 docker 家族中不可或缺的一部分,使用它来连接容器以进行协作是预期和可取的。 如果是这样,docker-compose 是否可以与集群中不同节点的容器一起使用?
它们提供不同的功能,并将继续为一个目的服务。 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 存储的覆盖网络。 使用群模式堆栈,这将是一个覆盖网络。
使用 docker 网络是让容器相互通信的首选方式。 您希望每组容器都有一个网络,您希望将其与 docker 环境的其余部分隔离。 docker-compose 自动创建此网络,但您也可以使用docker networks create
从命令行执行此操作。
链接已在很大程度上被具有内置 DNS 发现的 docker 网络所取代。 当您从 docker-compose.yml 中删除链接时,您可能需要将它们替换为depends_on
部分以强制执行容器启动顺序。 否则,链接有意义的场景很少,我看到的所有用法都来自遵循过时文档的人。
组合或群或群覆盖网络
如果您在笔记本电脑等上进行演示以外的任何其他操作,您会发现需要使用上述所有内容。
我特意将 swarm 和 swarm 覆盖网络分开,因为您不需要同时使用两者,但是如果没有 swarm 在它下面,您就无法获得覆盖网络。
Compose 用于将多个容器组合在一起。 现在它们彼此相关是有道理的,尽管它们可能不是。 但是让我们假设一个典型的案例,当容器用于彼此相关的服务时,您会希望它们以某种方式相互通信,但又要控制它们如何使用网络相互通信。 例如,以一个具有 web 服务器、应用服务器和数据库的 3 层应用程序为例。 假设所有三个组件都已 dockerized,并且您正在使用 compose 将它们组合在一起,而不是运行docker run..
使用不同的参数三次等。所有三个都会出现,但您需要控制它们如何相互连接。 您希望网络服务器能够与应用服务器通信,但不能直接与数据库通信。 并且您希望应用服务器与(ping)db 服务器容器并ping web 服务器。 所有连接都是双向的,但仅限于您希望能够相互通信的那些服务。 对于这样的安排,您通常会设置 2 个网络 - 比如frontend
和backend
。 Web 和应用程序容器连接到前端网络。 app 和 db 容器连接到后端网络。 因为 db 和 web 容器之间没有公共网络,所以它们不能相互接触(ping),这是您的意图。
现在,如果您希望这 3 个服务能够在由 100 台机器组成的集群上运行,并且您还希望在它们之间进行扩展,您将需要一个跨越多个主机的网络。 这就是覆盖网络(在 swarm 中)出现的地方。 覆盖网络只不过是基于 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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.