我无法从mongodb
群集连接到外部docker swarm
服务器。
据我了解这是因为群集使用覆盖网络驱动程序。我是对的吗?
如果没有,docker overlay驱动程序如何工作以及如何从群集连接到外部mongodb
服务器?
答案 0 :(得分:13)
问。 docker overlay驱动程序如何工作?
这表明:
Docker使用嵌入式DNS为在单个Docker引擎上运行的容器和在Docker Swarm中运行的任务提供服务发现。 Docker Engine有一个内部DNS服务器,可以为用户定义的网桥,覆盖和MACVLAN网络中的主机上的所有容器提供名称解析。
每个Docker容器(或Swarm模式下的任务)都有一个DNS解析器,可以将DNS查询转发到Docker Engine,后者充当DNS服务器。
因此,在多主机docker swarm mode
中,使用此示例设置:
在此示例中,有两个名为
myservice
的容器的服务。第二个服务(client
)存在于同一网络中。client
为docker.com和curl
执行两项myservice
操作。这些是由此产生的结果:
- DNS查询由
client
docker.com
和myservice
发起。- 容器的内置解析器拦截
127.0.0.11:53
上的DNS查询,并将它们发送到Docker Engine的DNS服务器。myservice
解析为该服务的虚拟IP(VIP),该服务在内部负载均衡到各个任务IP地址。容器名称也会解析,但直接解析为其IP地址。docker.com
在mynet网络中不作为服务名称存在,因此请求转发到配置的默认DNS服务器。
回到你的问题:
如何连接到外部mongodb服务器表单群集?
对于您的外部mongodb
(假设您有mongodb.mydomain.com
的DNS),您与上述架构中的client
处于相同的情况,想要连接到docker.com
,但您当然不希望将mongodb.mydomain.com
公开给整个网络,因此您可能已在内部群集DNS服务器中声明它。
然后,如何告诉docker引擎使用此内部DNS服务器来解析mongodb.mydomain.com
?
您必须在docker service
任务中指明您要使用internal DNS server,如下所示:
docker service create \
--name myservice \
--network my-overlay-network \
--dns=10.0.0.2 \
myservice:latest
重要的是--dns=10.0.0.2
。如果无法解析VIP中的DNS名称,这将告诉Docker引擎在10.0.0.2:53
使用DNS服务器作为默认值。
最后,当你说:
我无法从docker swarm群集连接到外部mongodb服务器。据我了解这是因为集群使用覆盖网络驱动程序。我对吗?
我会拒绝,因为docker engine
中有一个内置方法可以将来自overlay network
的未知DNS名称转发到您想要的DNS服务器。
希望这有帮助!