繁体   English   中英

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

[英]When to use Docker-Compose and when to use Docker-Swarm

我试图了解Docker-ComposeDocker-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-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。
  • links :一种在桥接网络之前将容器连接在一起的方法。 不再推荐其使用。
  • 经典 swarm :作为容器运行的集成 swarm 模式的前身,允许多个引擎显示为一个,但不提供编排或包含自己的 k/v 存储。

回答问题:

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 个网络 - 比如frontendbackend Web 和应用程序容器连接到前端网络。 app 和 db 容器连接到后端网络。 因为 db 和 web 容器之间没有公共网络,所以它们不能相互接触(ping),这是您的意图。

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

我希望澄清。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM