我可以在不使用 docker swarm 的情况下设置 docker 覆盖网络吗?

FVC*_*VCC 0 docker docker-compose docker-swarm

我有两组服务(容器组)在两台不同的机器上运行。两组服务都是使用 docker-compose 文件声明的。目前,在每个 docker-compose 文件中,我都包含一个桥接网络。这两组服务通过明确提及每台机器的 IP 地址来相互通信。

  1. 如果我让这两个 Docker 服务集通过覆盖网络相互通信,而不是像我现在那样通过硬编码 IP 地址来让每个服务集相互通信,这会减少网络延迟吗?换句话说,会提高这两个服务之间的通信性能吗?

  2. 如果上一个问题的答案是肯定的,那么我可以在不使用 docker swarm 的情况下在这两台机器之间定义一个覆盖网络吗?另外,我可以在 docker-compose 文件中声明这个 docker-swarm 网络吗?

如果您有 .yaml 配置文件或命令行代码片段可以完成我想要的操作,我们将不胜感激。

BMi*_*tch 5

覆盖网络会减少延迟吗?

很可能不会,它为需要在连接的每一端处理的 IP 数据包添加了额外的封装层。通常,人们使用覆盖网络来简化集群间通信并降低服务发现的复杂性(应用程序可以通过服务名称进行通信,而无需在另一个节点上查找外部 IP/端口。

您需要集群模式进行叠加吗?

不,但它使它变得更容易,以至于我不会回到运行像 consul 这样的外部键/值数据库并将 docker 与之集成的旧方式。您也不能将配置覆盖网络数据库的旧方法与 swarm 模式混合使用,因此如果您决定将来使用 swarm,则需要禁用旧的 k/v 数据库配置并重新创建覆盖网络。

Swarm 模式非常容易启用:

docker swarm init
Run Code Online (Sandbox Code Playgroud)

然后按照说明使用所需的标志(例如网络接口)重新运行 init 命令,或者将其他节点加入集群。

重要的是,您的容器本身不需要通过集群模式进行管理,您可以将其保留为仅管理覆盖网络的 k/v 数据库。创建网络时,请确保将其设置为可连接,以允许 Swarm 模式之外的容器使用它:

docker network create -d overlay --attachable overlay-net-name
Run Code Online (Sandbox Code Playgroud)

您还可以在撰写文件中定义它,只需确保指定网络名称,通常该网络名称对于稍后启动的服务来说是外部的。