有谁知道查询 docker 守护进程使用的嵌入式 dns 服务器的方法。我正在尝试使用 packetbeats,如果我可以用容器名称替换 docker ip 地址,那将会很有用。
我目前能想到的唯一方法是在容器中创建一个 dns 服务器,该容器可以配置为主机的 dns 服务器,以确保主机可以解析容器名称。希望这有意义吗?
这是唯一的方法还是有其他选择?
我尝试查询的容器是使用 docker-compose 创建的。
有谁知道查询 docker 守护进程使用的嵌入式 dns 服务器的方法。我正在尝试使用 packetbeats,如果我可以用容器名称替换 docker ip 地址,那将会很有用。
我目前能想到的唯一方法是在容器中创建一个 dns 服务器,该容器可以配置为主机的 dns 服务器,以确保主机可以解析容器名称。希望这有意义吗?
这是唯一的方法还是有其他选择?
我尝试查询的容器是使用 docker-compose 创建的。
我喜欢为此使用 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。我对它不是很熟悉,但是对于一个非常小的规模设置,它可以让你的主机对正在运行的容器进行 DNS 感知。
您可以使用像图像一样socat
公开 Docker 网络的解析器,这本质上是:127.0.0.11:53
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
可以使用(使用 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 开发环境非常方便。
另一种方法是使用docker-dns。它是一个 docker 容器,它公开了一个解析 docker 容器的 dns 服务器。
运行它就像
docker run -d --name dns -v /var/run/docker.sock:/docker.sock phensley/docker-dns