首页 文章

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

提问于
浏览
31

我试图理解 D-ComposeD-Swarm 之间的差异或相似之处 .

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

另外,我对docker-swarm的理解是它允许你管理不同docker-hosts的集群,每个docker-hosts都运行一些docker-images的几个容器实例 . 我们可以将群中的不同容器之间的连接定义为 overlay-networks (即使它们跨越群中的两个docker-hosts)以将它们作为一个单元连接起来 .

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

或者,docker-compose仍然是整个docker系列中不可或缺的一部分,并且可以使用它来连接容器以协同工作 . 如果是这样,docker-compose在群中的不同节点上使用容器?

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

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

我有点困惑???

非常感谢!

3 回答

  • 51

    它可能有助于从一些定义开始:

    • docker-compose :用于配置和管理一组相关容器的命令 . 它是与 docker run 等命令相同的api 's used by the docker cli, so you can reproduce it'行为的前端 .

    • docker-compose.yml :一组容器的定义文件,由docker-compose使用,现在也由swarm模式使用 .

    • swarm mode :用于将一组docker引擎作为单个实体进行管理并提供编排(不断尝试纠正当前状态和目标状态之间的任何差异) .

    • service :一个或多个容器,用于swarm中的相同映像和配置,多个容器提供可伸缩性 .

    • stack :群中的一个或多个服务,可以使用DAB或docker-compose.yml文件定义这些服务 .

    • bridge network :由单个docker引擎管理的网络,其中多个容器可以相互通信 . 您可能有多个由引擎管理的网络,并且容器可以连接到零个或多个网络 .

    • overlay network :类似于桥接网络但跨越多个docker引擎 . 这些需要键/值存储来维持其状态 . Swarm模式提供此功能,但如果禁用swarm模式,您也可以使用etcd,consul或zookeeper .

    • links :一种在桥接网络之前连接容器的方法 . 不再推荐使用它 .

    • classic swarm :作为容器运行的集成群模式的前身允许多个引擎显示为一个,但不提供编排或包含其自己的k / v存储 .

    回答问题:

    docker-swarm成功了docker-compose和overlay网络是连接容器的新(推荐)方式吗?或者,docker-compose仍然是整个docker系列中不可或缺的一部分,并且可以使用它来连接容器以协同工作 . 如果是这样,docker-compose在群中的不同节点上使用容器?

    它们提供不同的功能,并将继续用于一个目的 . docker-compose无法在swarm模式下启动容器,但是较新版本的docker-compose.yml文件(版本3)可用于直接在swarm模式下定义堆栈,而无需使用docker-compose本身 . 需要docker-compose来管理群集模式之外的容器,单个docker引擎或经典swarm .

    或者是覆盖网络用于连接群中不同主机的容器,而docker-compose用于创建内部链接?此外,我还看到在docker文档中提到 - 不再推荐链接,很快就会过时 .

    从yml文件的第2版开始的docker-compose默认情况下将多个容器连接在一起,每个项目都有一个新的桥接网络(项目默认为目录名) . 使用经典swarm,默认使用外部k / v存储的覆盖网络 . 和使用群模式堆栈,这将是一个覆盖网络 .

    使用docker networks是让容器相互通信的首选方式 . 您希望每组容器都有一个网络,希望与其余的docker环境隔离 . docker-compose会自动创建此网络,但您也可以使用 docker networks create 从命令行执行此操作 .

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

  • 4

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

    如果您在笔记本电脑上进行演示以外的任何操作,您会发现需要使用上述所有内容 .

    我故意将swarm和swarm覆盖网络分开,因为你不需要同时使用它们,但如果没有一个swarm,你就无法获得覆盖网络 .

    撰写是为了将多个容器组合在一起 . 现在它们彼此相关是有意义的,尽管它们可能不相关 . 但是让's suppose a typical case when the containers are for services that are related to each other, then you would want them to talk to each other in some way, but yet control how they talk to each other using networks. For example, take a 3 tier app that has a webserver, appserver and db. Let'说所有三个组件都是docker化的,你使用compose将它们组合在一起而不是用不同的参数运行 docker run.. 三次等等 . 所有三个都会出现,但是你想要控制它们如何相互连接 . 您希望Web服务器能够与应用程序服务器通信,而不是直接与数据库通信 . 并且您希望appserver与数据库服务器容器通话(ping)并ping Web服务器 . 所有连接都是双向的,但仅限于您希望能够相互通信的那些服务 . 对于这样的安排,您通常会设置2个网络 - 例如 frontendbackend . Web和app容器连接到前端网络 . app和db容器连接到后端网络 . 因为db和web容器之间没有公共网络,所以它们不能互相触摸(ping),这是你的意图 .

    现在,如果您希望这3个服务能够在100个计算机的集群上运行,并且您还希望跨越它们进行扩展,则需要跨越多个主机的网络 . 这就是覆盖网络(群集)出现的情况 . 覆盖网络只不过是通过VxLAN技术构建的多主机网络 . 您不必了解VxLAN,除了它是几乎所有现代网络基础架构都支持的标准网络拓扑 .

    我希望澄清一下 .

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

  • 3

    我认为你对大多数的理解都是正确的,但是需要进行一些调整 .

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

相关问题