27

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

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

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

4

1 回答 1

48

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

我会推荐这个很好的参考来了解 docker swarm 网络覆盖,以及更广泛地了解 Docker 的架构

这表明:

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

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

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

建筑学

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

这些是产生的动作:

  • DNS 查询由clientfordocker.com和发起myservice
  • 容器的内置解析器拦截 DNS 查询127.0.0.11:53并将它们发送到 Docker 引擎的 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

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

最后,当你说:

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

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

希望这可以帮助!

于 2017-07-06T08:04:01.900 回答