我无法从我的 docker swarm
集群连接到外部的 mongodb
服务器。
据我了解,这是由于集群使用了覆盖网络驱动程序。我的理解正确吗?
如果不是,那么 docker 覆盖驱动程序是如何工作的,我该如何从集群中连接到外部的 mongodb
服务器?
我无法从我的 docker swarm
集群连接到外部的 mongodb
服务器。
据我了解,这是由于集群使用了覆盖网络驱动程序。我的理解正确吗?
如果不是,那么 docker 覆盖驱动程序是如何工作的,我该如何从集群中连接到外部的 mongodb
服务器?
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
下,假设有以下设置:
在此示例中,有两个容器组成的名为
myservice
的服务。同一网络中还存在第二个服务(client
)。client
执行了两个针对docker.com和myservice
的curl操作。这些是产生的操作:
client
启动DNS查询以获取docker.com
和myservice
。- 容器内置解析器在
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服务器。
希望这有所帮助!