什么是叠加网络以及DNS解析如何运作?

时间:2017-06-23 14:59:49

标签: networking docker docker-swarm docker-swarm-mode

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

据我了解这是因为群集使用覆盖网络驱动程序。我是对的吗?

如果没有,docker overlay驱动程序如何工作以及如何从群集连接到外部mongodb服务器?

1 个答案:

答案 0 :(得分:13)

问。 docker overlay驱动程序如何工作?

我建议this good reference for understanding docker swarm network overlay, and more globally, Docker's architecture

这表明:

  

Docker使用嵌入式DNS为在单个Docker引擎上运行的容器和在Docker Swarm中运行的任务提供服务发现。 Docker Engine有一个内部DNS服务器,可以为用户定义的网桥,覆盖和MACVLAN网络中的主机上的所有容器提供名称解析。

     

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

因此,在多主机docker swarm mode中,使用此示例设置:

architecture

  

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

     

这些是由此产生的结果:

     
      
  • DNS查询由client docker.commyservice发起。
  •   
  • 容器的内置解析器拦截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服务器。

希望这有帮助!