从主机查询 docker 个嵌入式 DNS

Query docker embedded dns from host

有人知道查询 docker 守护程序使用的嵌入式 DNS 服务器的方法吗?我正在试验 packetbeats,如果我可以用容器名称替换 docker ip 地址,那将会很有用。

目前我能想到的唯一实现方式是在容器中创建一个dns服务器,可以配置为宿主机的dns服务器,保证容器名称可以被宿主机解析。希望这是有道理的?

这是唯一的方法还是有其他选择?

我要查询的容器是使用 docker-compose 创建的。

领事

我喜欢为此使用 Hashicorp 的 Consul。它可以 运行 作为已安装的客户端或容器,并提供一个 DNS 接口 ,您可以在 Docker 外部查询。它还具有服务发现和监控等功能,并且是开源的。

https://www.consul.io/docs/agent/dns.html

One of the primary query interfaces for Consul is DNS. The DNS interface allows applications to make use of service discovery without any high-touch integration with Consul.

For example, instead of making HTTP API requests to Consul, a host can use the DNS server directly via name lookups like "redis.service.east-aws.consul". This query automatically translates to a lookup of nodes that provide the redis service, are located in the "east-aws" datacenter, and have no failing health checks. It's that simple!

对于您要找的东西来说可能有些过分,但应该可以。

DNSMasq

一个更简单的替代方案可能是 DNSMasq。我不太熟悉它,但对于非常小的规模设置,它可以让您的主机了解 运行ning 容器的 DNS。

http://www.thekelleys.org.uk/dnsmasq/doc.html

https://hub.docker.com/r/andyshinn/dnsmasq/

您可以使用 socat127.0.0.11:53 公开 Docker 网络的解析器,就像 cirocosta/expose-edns 图像那样,本质上是:

socat UDP4-RECVFROM:53,fork,bind="0.0.0.0" UDP4-SENDTO:127.0.0.11:53

然后像这样使用它:

host container_name_to_resolve `docker inspect --format \
  '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' socat_container_name`

另请注意,socat 容器必须与目标容器位于同一 Docker 网络中。

更新

为了克服同一个Docker网络的限制,phensley/docker-dns can be used (which uses Docker API). On an OS with NetworkManager and Dnsmasq enabled (otherwise can be enabled like described in this answer)你可以运行:

docker run -d --name docker-dns -v /var/run/docker.sock:/docker.sock \
  phensley/docker-dns --domain docker --no-recursion     

然后检查其 IP 地址:

docker inspect --format \
   '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-dns

并将其放入 /etc/NetworkManager/dnsmasq.d/docker.conf 中,例如:

server=/docker/1.2.3.4

systemctl restart NetworkManager 之后,您应该能够从像 ping CONTAINER_NAME.docker 这样的主机寻址您的 Docker 容器,这对于码头化的开发环境来说非常方便。

另一种方法是使用 docker-dns。它是一个 docker 容器,公开了解析 docker 容器的 dns 服务器。

运行就这么简单

docker run -d --name dns -v /var/run/docker.sock:/docker.sock phensley/docker-dns