什么是覆盖网络,DNS解析如何工作?

29

我无法从我的 docker swarm 集群连接到外部的 mongodb 服务器。

据我了解,这是由于集群使用了覆盖网络驱动程序。我的理解正确吗?

如果不是,那么 docker 覆盖驱动程序是如何工作的,我该如何从集群中连接到外部的 mongodb 服务器?

1个回答

54

Q. docker覆盖驱动程序是如何工作的?

我建议阅读这篇好文章了解docker swarm网络覆盖以及Docker的整体架构

该文章指出:

Docker使用内嵌DNS为在单个Docker Engine上运行的容器和在Docker Swarm中运行的任务提供服务发现。 Docker Engine具有内部DNS服务器,为用户定义的桥接、覆盖和MACVLAN网络中的所有容器提供名称解析。

每个Docker容器(或Swarm模式中的任务)都有一个DNS解析器,该解析器将DNS查询转发给Docker Engine,后者充当DNS服务器。

因此,在多主机docker swarm mode下,假设有以下设置:

architecture

在此示例中,有两个容器组成的名为myservice的服务。同一网络中还存在第二个服务(client)。client执行了两个针对docker.com和myservice的curl操作。

这些是产生的操作:

  • client启动DNS查询以获取docker.commyservice
  • 容器内置解析器在127.0.0.11:53上拦截DNS查询并将其发送到Docker Engine的DNS服务器。
  • myservice解析为该服务的虚拟IP(VIP),该VIP内部负载平衡到单个任务的IP地址。容器名称也能够解析为它们的IP地址。
  • docker.com不作为mynet网络中的服务名称存在,因此该请求转发到配置的默认DNS服务器

回到您的问题:

如何从集群连接到外部mongodb服务器?

对于外部的mongodb(假设你有一个名为mongodb.mydomain.com的DNS),您面临与上述架构中的client相同的情况,希望连接到docker.com,但您肯定不希望将mongodb.mydomain.com暴露给整个网络,因此您可能已将其声明在内部集群DNS服务器中。

那么,如何告诉docker engine使用此内部DNS服务器来解析mongodb.mydomain.com

您必须在docker service任务中指示您要使用内部DNS服务器,例如:

docker service create \
--name myservice \
--network my-overlay-network \
--dns=10.0.0.2 \
myservice:latest

这里的重点在于--dns=10.0.0.2。这将告诉Docker引擎,在无法解析VIP中的DNS名称时,默认使用位于10.0.0.2:53的DNS服务器。

最后,当你说:

我无法从我的Docker Swarm集群连接到外部mongodb服务器。我理解这是因为集群使用了叠加网络驱动程序。我是正确的吗?

我会说不是,因为Docker引擎中有一种内置方法,可以将来自叠加网络的未知DNS名称转发到你想要的DNS服务器。

希望这有所帮助!


嗨,Francois,感谢您非常有帮助的回复。 我正在尝试使用Swarm作为K8s的简单替代方案,但我错过了一个关键功能:命名空间。是否有任何方法可以使DNS查找包括某种命名空间?假设我想在同一Swarm中多次运行应用程序堆栈,我将不得不以不同的名称命名每个堆栈的服务:app_dev,app_staging,app_production等... - FabianTe
@FabianTe 我想你是对的,就我所记得的,Swarm 中没有命名空间。因此,您必须以不同的名称命名相同的应用程序。在我的专业项目中,我已经转向 K8s 用于生产,但 Swarm 对于小型基础设施仍然是一个不错的选择,您需要权衡每种解决方案的优缺点。 - François Maturel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接