从主机查询docker嵌入的dns

K2J*_*K2J 8 dns docker packetbeat

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

我目前可以想到的唯一方法是在容器中创建一个dns服务器,可以将其配置为主机的dns服务器,以确保主机可以解析容器名称.希望有道理吗?

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

我正在尝试查询的容器是使用docker-compose创建的.

saa*_*aaj 5

您可以像图像一样socat公开 Docker 网络的解析器,本质上是:127.0.0.11:53cirocosta/expose-edns

socat UDP4-RECVFROM:53,fork,bind="0.0.0.0" UDP4-SENDTO:127.0.0.11:53
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

host container_name_to_resolve `docker inspect --format \
  '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' socat_container_name`
Run Code Online (Sandbox Code Playgroud)

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

更新

为了克服同一个Docker网络的限制,phensley/docker-dns可以使用Docker(它使用Docker API)。在启用了 NetworkManager 和 Dnsmasq 的操作系统上(否则可以像此答案中所述启用),您可以运行:

docker run -d --name docker-dns -v /var/run/docker.sock:/docker.sock \
  phensley/docker-dns --domain docker --no-recursion     
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令检查其 IP 地址:

docker inspect --format \
   '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-dns
Run Code Online (Sandbox Code Playgroud)

并将其放入/etc/NetworkManager/dnsmasq.d/docker.conf类似:

server=/docker/1.2.3.4
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*Dan 4

领事

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

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

Consul 的主要查询接口之一是 DNS。DNS 接口允许应用程序利用服务发现,而无需与 Consul 进行任何高接触集成。

例如,主机可以通过名称查找(例如“redis.service.east-aws.consul”)直接使用 DNS 服务器,而不是向 Consul 发出 HTTP API 请求。此查询会自动转换为查找提供 Redis 服务、位于“east-aws”数据中心且没有失败的运行状况检查的节点。就这么简单!

对于您正在寻找的东西来说,这可能有点矫枉过正,但应该可以完成工作。

DNS掩码

更简单的替代方案可能是 DNSMasq。我不太熟悉它,但对于一个非常小的规模设置,它可以让你的主机通过 DNS 感知正在运行的容器。

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

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