从主机查询 docker 个嵌入式 DNS
Query docker embedded dns from host
有人知道查询 docker 守护程序使用的嵌入式 DNS 服务器的方法吗?我正在试验 packetbeats,如果我可以用容器名称替换 docker ip 地址,那将会很有用。
目前我能想到的唯一实现方式是在容器中创建一个dns服务器,可以配置为宿主机的dns服务器,保证容器名称可以被宿主机解析。希望这是有道理的?
这是唯一的方法还是有其他选择?
我要查询的容器是使用 docker-compose 创建的。
领事
我喜欢为此使用 Hashicorp 的 Consul。它可以 运行 作为已安装的客户端或容器,并提供一个 DNS 接口 ,您可以在 Docker 外部查询。它还具有服务发现和监控等功能,并且是开源的。
https://www.consul.io/docs/agent/dns.html
One of the primary query interfaces for Consul is DNS. The DNS interface allows applications to make use of service discovery without any high-touch integration with Consul.
For example, instead of making HTTP API requests to Consul, a host can use the DNS server directly via name lookups like "redis.service.east-aws.consul". This query automatically translates to a lookup of nodes that provide the redis service, are located in the "east-aws" datacenter, and have no failing health checks. It's that simple!
对于您要找的东西来说可能有些过分,但应该可以。
DNSMasq
一个更简单的替代方案可能是 DNSMasq。我不太熟悉它,但对于非常小的规模设置,它可以让您的主机了解 运行ning 容器的 DNS。
您可以使用 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 网络中。
更新
为了克服同一个Docker网络的限制,phensley/docker-dns
can be used (which uses Docker API). On an OS with NetworkManager and Dnsmasq enabled (otherwise can be enabled like described in this answer)你可以运行:
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
之后,您应该能够从像 ping CONTAINER_NAME.docker
这样的主机寻址您的 Docker 容器,这对于码头化的开发环境来说非常方便。
另一种方法是使用 docker-dns。它是一个 docker 容器,公开了解析 docker 容器的 dns 服务器。
运行就这么简单
docker run -d --name dns -v /var/run/docker.sock:/docker.sock phensley/docker-dns
有人知道查询 docker 守护程序使用的嵌入式 DNS 服务器的方法吗?我正在试验 packetbeats,如果我可以用容器名称替换 docker ip 地址,那将会很有用。
目前我能想到的唯一实现方式是在容器中创建一个dns服务器,可以配置为宿主机的dns服务器,保证容器名称可以被宿主机解析。希望这是有道理的?
这是唯一的方法还是有其他选择?
我要查询的容器是使用 docker-compose 创建的。
领事
我喜欢为此使用 Hashicorp 的 Consul。它可以 运行 作为已安装的客户端或容器,并提供一个 DNS 接口 ,您可以在 Docker 外部查询。它还具有服务发现和监控等功能,并且是开源的。
https://www.consul.io/docs/agent/dns.html
One of the primary query interfaces for Consul is DNS. The DNS interface allows applications to make use of service discovery without any high-touch integration with Consul.
For example, instead of making HTTP API requests to Consul, a host can use the DNS server directly via name lookups like "redis.service.east-aws.consul". This query automatically translates to a lookup of nodes that provide the redis service, are located in the "east-aws" datacenter, and have no failing health checks. It's that simple!
对于您要找的东西来说可能有些过分,但应该可以。
DNSMasq
一个更简单的替代方案可能是 DNSMasq。我不太熟悉它,但对于非常小的规模设置,它可以让您的主机了解 运行ning 容器的 DNS。
您可以使用 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 网络中。
更新
为了克服同一个Docker网络的限制,phensley/docker-dns
can be used (which uses Docker API). On an OS with NetworkManager and Dnsmasq enabled (otherwise can be enabled like described in this answer)你可以运行:
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
之后,您应该能够从像 ping CONTAINER_NAME.docker
这样的主机寻址您的 Docker 容器,这对于码头化的开发环境来说非常方便。
另一种方法是使用 docker-dns。它是一个 docker 容器,公开了解析 docker 容器的 dns 服务器。
运行就这么简单
docker run -d --name dns -v /var/run/docker.sock:/docker.sock phensley/docker-dns