当前位置: 首页 > 知识库问答 >
问题:

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

邹正阳
2023-03-14

我试图理解Docker Compose和Docker Swarm之间的区别或相似之处。

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

此外,我对docker-swarm的理解是,它允许您管理不同docker主机的集群,每个主机都运行一些docker-image的几个容器实例。我们可以将连接定义为群中不同容器之间的覆盖网络(即使它们跨越群中的两个停靠主机),以将它们连接为一个单元。

我试图理解的是,Docker-swarm成功的Docker-compose和overlay网络是否是连接容器的新(推荐)方式?

还是docker-compose仍然是整个docker家族不可或缺的一部分,并且使用它来连接容器以协作工作是预期和建议的。如果是这样,docker-compose是否适用于群中不同节点的容器??

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

此外,我也看到它是在docker留档中提到的-链接不再推荐,很快就会过时。

我有点困惑???

非常感谢!

共有3个答案

危卜鹰
2023-03-14

我认为你对每一个都有正确的理解,但是还需要一些调整。

您是正确的docker-compose是启动多容器应用程序。早些时候,您习惯于执行docker run...来启动每个容器。通常采用微服务范式的现代应用程序可以由数十个服务组成,并使用docker run...很快就会变得非常无聊。因此docker-compose允许您将所有容器及其属性以及它们如何作为yamljson文件相互连接,以便您可以以更轻松的方式管理它。

因此,docker-compose是docker生态系统中的容器编排部分。

链接是不同的,它们只是docker-compose或< code>docker run命令的一部分,并且不赞成使用< code >软件定义的网络,其中< code >覆盖网络只是其中之一。

Swarm 是 docker 中的调度组件。什么是调度 - 它只是弄清楚在Docker主机集群中“放置”容器的位置。您可以拥有一个由数百台服务器组成的集群,也可以拥有数百个容器,每个容器封装了十几个不同应用程序的服务。现在,这些容器应该如何分布在数百台服务器的集群中,是否应该将某些容器仅放置在某些主机上,因为它们满足特定的条件,或者它们应该更接近(或不靠近)其他以某种方式相关的容器......所有这些都是由 docker Swarm 执行的调度组件的一部分。

我建议你在这里浏览一下关于docker.com的入门文档:https://docs.docker.com/engine/getstarted-voting-app/

李睿
2023-03-14

组合或群或群覆盖网络

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

我故意把虫群分开

Compose用于将多个容器放在一起。现在它们相互关联是有道理的,尽管它们可能不是。但是让我们假设一个典型的情况,当容器用于相互关联的服务时,您会希望它们以某种方式相互通信,但同时控制它们如何使用网络相互通信。例如,以一个3层应用程序为例,它有一个webserver、appserver和db。假设所有三个组件都被dockerated,并且您使用compose将它们放在一起,而不是运行docker run...三次使用不同的参数等。这三个都会出现,但您希望控制它们如何相互连接。您希望Web服务器能够与应用html" target="_blank">服务器通信,但不能直接与数据库通信。您希望应用服务器与db服务器容器通信(ping)并ping Web服务器。所有连接都是双向的,但仅限于您希望能够相互通信的服务。对于这样的安排,您通常会设置2个网络——例如前端后端。Web和应用容器连接到前端网络。应用程序和数据库容器连接到后端网络。因为db和web容器之间没有公共网络,所以它们不能相互接触(ping),这就是您的意图。

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

我希望这能澄清。

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

漆雕伟志
2023-03-14

从几个定义开始可能会有所帮助:

  • docker-compose:用于配置和管理一组相关容器的命令。它是 docker cli 使用的相同 api 的前端,因此您可以使用 docker run 等命令重现其行为。
  • docker-compose.yml:一组容器的定义文件,由 docker-compose 使用,现在也由 swarm 模式使用。
  • swarm 模式:用于将一组 Docker 引擎作为单个实体进行管理并提供编排(不断尝试更正当前状态和目标状态之间的任何差异)。
  • 服务:一个或多个容器用于 swarm 中的相同映像和配置,多个容器提供可扩展性。
  • 堆栈:群中的一个或多个服务,这些服务可以使用DAB或docker-compose.yml文件定义。
  • 网桥网络:由单个 Docker 引擎管理的网络,其中多个容器可以相互通信。您可能有多个由引擎管理的网络,并且容器可以附加到零个或多个网络。
  • 覆盖网络:类似于网桥网络,但跨越多个 Docker 引擎。它们需要键/值存储来维护其状态。群模式提供了这一点,但如果集群模式被禁用,你也可以使用etcd,领事或动物园管理员。
  • links:一种将容器连接在一起的方法,早于桥接网络。不再建议使用它。
  • 经典群:作为容器运行的集成群模式的前身,允许多个引擎显示为一个引擎,但不提供编排或包含自己的 k/v 存储。

要回答这些问题:

docker-sward是否成功docker-compose和覆盖网络是连接容器的新(推荐)方式?

还是docker-compose仍然是整个docker家族不可或缺的一部分,并且使用它来连接容器以协作工作是预期和建议的。如果是这样,docker-compose是否适用于群中不同节点的容器??

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

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

此外,我也看到它是在docker留档中提到的-链接不再推荐,很快就会过时。

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

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

链接在很大程度上已经被内置DNS发现的docker网络所取代。当您从docker-compose.yml中删除链接时,您可能需要用depends_on部分来替换它们以强制执行容器启动命令。否则,很少有链接有意义的情况,我看到的所有用法都是来自遵循过时留档的人。

 类似资料:
  • 我正在开发一个带有多个docker容器的微服务。使用docker-compose可以创建我想要的图像,但也可以创建其他几个图像副本,这些副本会填满我的磁盘空间。这其他子图像有什么用,我可以阻止他们被创建,因为他们正在消耗我的内存。请注意,它们并不是真正的“悬空”,它们只是出现在构建中。

  • 问题内容: 我想通过docker-compose建立映像并为其设置特定标签。文档说: Compose将使用生成的名称来构建并标记它,然后使用该图像。 但是我找不到指定标签的方法,对于生成的图像,我总是看到“最新”标签。 问题答案: 似乎文档/工具已更新,您现在可以将标记添加到脚本中。这对我来说是成功的。 例: https://docs.docker.com/compose/compose- fil

  • 我想通过docker compose构建图像,并为其设置特定标记。文件说: Comment将构建并用生成的名称标记它,然后使用该映像。 但是我找不到指定标签的方法,对于构建的图像,我总是看到“最新”标签。

  • 我和我的团队一直在使用Spring boot开发一系列微服务。由于服务经历了JUnit和Spring Boot升级(我们现在使用的是Spring Boot 2和JUnit 5),不同开发人员实现的不同JUnit现在使用不同的模式: @扩展为 今天,它们之间的区别是什么?我们真的需要它们来进行单元测试还是嵌入到一些新的Spring Boot注释中?

  • 问题内容: 我有一个运行一些Dockerfile的docker- compose文件来创建我的容器。我不想编辑Dockerfile来设置时区,因为它们可能会随时被团队成员更改,并且我有一个docker- compose.override.yml文件可以进行本地环境更改。但是,我的一个容器(基于Selenium的容器)似乎没有拉主机时区,这给我带来了麻烦。基于此,我想在所有容器上实施时区。现在在我的

  • 我有一个运行几个Dockerfile来创建我的容器的docker撰写文件。我不想编辑我的Dockerfile来设置时区,因为它们可以随时由我的团队成员更改,我有一个docker-compose.override.yml文件来进行本地环境更改。然而,我的一个容器(基于硒的容器)似乎没有拉动主机时区,这给我带来了问题。基于此,我想在所有容器上强制执行时区。在我的Dockerfile里我知道 一切正常。