14

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

我目前能想到的唯一方法是在容器中创建一个 dns 服务器,该容器可以配置为主机的 dns 服务器,以确保主机可以解析容器名称。希望这有意义吗?

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

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

4

3 回答 3

4

领事

我喜欢为此使用 Hashicorp 的领事。它可以作为已安装的客户端或容器运行,并提供一个可以在 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”数据中心,并且没有失败的健康检查。就是这么简单!

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

DNSMasq

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

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

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

于 2016-09-27T17:07:38.867 回答
4

您可以使用像图像一样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

然后像这样使用它:

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

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

更新

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

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您应该能够从主机寻址您的 Docker 容器之后,ping CONTAINER_NAME.docker这对于 dockerized 开发环境非常方便。

于 2019-03-06T18:26:26.917 回答
2

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

运行它就像

docker run -d --name dns -v /var/run/docker.sock:/docker.sock phensley/docker-dns
于 2019-05-08T13:14:13.547 回答