K2J*_*K2J 8 dns docker packetbeat
有没有人知道查询docker守护程序使用的嵌入式DNS服务器的方法.我正在尝试使用packetbeats,如果我可以用容器名称替换docker ip地址,那将会非常有用.
我目前可以想到的唯一方法是在容器中创建一个dns服务器,可以将其配置为主机的dns服务器,以确保主机可以解析容器名称.希望有道理吗?
这是唯一的方式还是有其他选择?
我正在尝试查询的容器是使用docker-compose创建的.
您可以像图像一样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
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
host container_name_to_resolve `docker inspect --format \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' socat_container_name`
Run Code Online (Sandbox Code Playgroud)
另请注意,socat容器必须与目标容器位于同一 Docker 网络中。
为了克服同一个Docker网络的限制,phensley/docker-dns可以使用Docker(它使用Docker API)。在启用了 NetworkManager 和 Dnsmasq 的操作系统上(否则可以像此答案中所述启用),您可以运行:
docker run -d --name docker-dns -v /var/run/docker.sock:/docker.sock \
phensley/docker-dns --domain docker --no-recursion
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令检查其 IP 地址:
docker inspect --format \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-dns
Run Code Online (Sandbox Code Playgroud)
并将其放入/etc/NetworkManager/dnsmasq.d/docker.conf类似:
server=/docker/1.2.3.4
Run Code Online (Sandbox Code Playgroud)
之后,systemctl restart NetworkManager您应该能够从主机寻址 Docker 容器,ping CONTAINER_NAME.docker这对于 Docker 化的开发环境来说非常方便。
我喜欢使用 Hashicorp 的 Consul 来完成此任务。它可以作为已安装的客户端或容器运行,并提供可以查询 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 感知正在运行的容器。
http://www.thekelleys.org.uk/dnsmasq/doc.html
https://hub.docker.com/r/andyshinn/dnsmasq/
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |