有没有人知道查询docker守护程序使用的嵌入式dns服务器的方法。我正在尝试使用packetbeats,如果我可以用容器名替换docker ip地址,那将非常有用。
我目前可以想到实现此目的的唯一方法是在容器中创建一个dns服务器,该容器可以配置为主机的dns服务器,以确保主机可以解析容器名称。希望有道理吗?
这是唯一的方式还是有其他选择?
我正在尝试查询的容器是使用docker-compose创建的。
答案 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。我并不熟悉它,但对于非常小的设置,它将允许您的主机知道运行容器的DNS。
答案 1 :(得分:0)
您可以使用socat
在127.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