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

Dmi*_*iko 15 networking docker docker-swarm docker-swarm-mode

我无法mongodbdocker swarm群集连接到外部服务器.

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

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

Fra*_*rel 21

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

我建议这个很好的参考,以了解docker swarm网络覆盖,以及更全面的Docker架构.

这表明:

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

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

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

建筑

在这个例子中,有一个叫两个容器的服务myservice.第二个服务(client)存在于同一网络上.在client执行其中的两个curl进行docker.com和操作myservice.

这些是由此产生的结果:

  • DNS查询由clientfor docker.com和发起myservice.
  • 容器的内置解析器拦截DNS查询127.0.0.11:53并将它们发送到Docker Engine的DNS服务器.
  • myservice解析为该服务的虚拟IP(VIP),该服务在内部负载平衡到各个任务IP地址.容器名称也会解析,尽管直接与其IP地址相关.
  • docker.com在mynet网络中不存在作为服务名称,因此请求将转发到配置的默认DNS服务器.

回到你的问题:

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

对于你的外部mongodb(假设你有一个DNS mongodb.mydomain.com),你处于与client上述架构相同的情况,想要连接docker.com,除了你当然不想将它暴露mongodb.mydomain.com给整个网络,所以您可能已在内部群集DNS服务器中声明它.

那么,如何告诉docker引擎使用这个内部DNS服务器来解决mongodb.mydomain.com

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

docker service create \
--name myservice \
--network my-overlay-network \
--dns=10.0.0.2 \
myservice:latest
Run Code Online (Sandbox Code Playgroud)

这里重要的是--dns=10.0.0.2.10.0.0.2:53如果无法解析VIP中的DNS名称,这将告诉Docker引擎默认使用DNS服务器.

最后,当你说:

我无法从docker swarm集群连接到外部mongodb服务器.据我了解这是因为集群使用覆盖网络驱动程序.我对吗?

我会说不,因为有一种内置方法docker engine可以将未知的DNS名称转发overlay network到您想要的DNS服务器.

希望这可以帮助!