在 docker 容器中使用 consul 的 DNS 接口

mor*_*arc 5 networking dns docker consul

我的主机上运行着一个 consul 代理,并且在 docker 容器内运行着一些服务。我正在使用“gliderlabs/registrator”来发现这些服务并向当地领事代理注册它们。

领事代理被配置为接受来自任何地方的连接("client_addr": "0.0.0.0"选项),我可以通过dig @172.17.42.1 -p 8600 someservice.service.consul从主机进行“证明”。

问题是我似乎无法在容器内执行相同的操作,挖掘请求只是超时,我curl也无法执行此操作。我确实通过了--dns 172.17.42.1。有任何想法吗?

注意:如果可能的话我想避免使用--net=host

谢谢!

小智 5

我遇到了同样的障碍,并且你的设置和我的看起来非常相似(我独立运行 Consul,而不是作为 Docker 容器)。

我也反对使用--net=host

使它在我的案例中发挥作用的原因是:

a)我为 Consul 创建了一个config.json,并在其中设置了属性ports.dsn以使用端口 53(DNS 默认值)。

您不能在 Docker 容器内使用 8600,这是因为该docker run --dns参数不允许您提供端口。

b)我使用主机的 LAN(专用)IP 作为值--dns。我之前尝试过其他值(0.0.0.0、公共 IP 和127.0.0.1),但这些值不起作用。

c)可选:您可以添加--dns-search="service.consul"到 ,docker run以便您可以拥有更短的域名(即避免编写该service.consul部分)。

进入容器后,您可以执行该容器的服务名称,nslookup ubuntu.service.consul前提是该服务名称是该容器的服务名称。

重要笔记

  • 您需要在容器上公开端口(即-P或标志)以获取它们。如果不共享端口,将默默地忽略容器。-pregistratorregistrator
  • 设置主机名(使用-h标志)是很好的。

希望这可以帮助!