从主机

时间:2016-09-27 16:17:37

标签: docker dns packetbeat

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

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

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

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

3 个答案:

答案 0 :(得分:2)

领事

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

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

  

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

     

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

对于你正在寻找的东西可能有点过头了,但是应该做好这件事。

的dnsmasq

更简单的替代方案可能是DNSMasq。我并不熟悉它,但对于非常小的设置,它将允许您的主机知道运行容器的DNS。

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

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

答案 1 :(得分:0)

您可以使用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网络中。

答案 2 :(得分:0)

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

运行起来就像

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