我的主机上运行着一个 consul 代理,docker 容器中运行着几个服务。我使用“gliderlabs/registrator”来发现这些服务,并将它们注册到本地 consul 代理中。
领事代理配置为接受来自各处的连接("client_addr": "0.0.0.0"
选项),我可以通过dig @172.17.42.1 -p 8600 someservice.service.consul
从主机执行来“证明”。
问题是我似乎无法在容器内执行相同的操作,挖掘请求超时,我curl
也无法执行。我确实通过了--dns 172.17.42.1
。有什么想法吗?
注意:如果可能的话我想避免使用--net=host
。
谢谢!
答案1
我遇到了同样的障碍,您的设置和我的设置看起来非常相似(我运行的是独立 Consul,而不是作为 Docker 容器运行)。
我也反对使用--net=host
!!!。
对我来说,让它起作用的原因是:
A)我已经config.json
为 Consul 创建了一个,并且在其中设置了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
或标志)以便接收它们。如果您不共享端口,则会默默忽略该容器。-p
registrator
registrator
- 设置主机名(使用标志)很好
-h
。
希望这可以帮助!