突然,当我使用 docker-compose 部署一些新容器时,内部主机名解析不起作用。
当我尝试使用 docker-compose.yaml 文件中的服务名称从另一个容器 ping 一个容器时,我得到了
ping: bad address 'myhostname'
我检查了 /etc/resolv.conf
是否正确,并且正在使用 127.0.0.11
当我尝试使用 nslookup myhostname.
或 nslookup myhostname.docker.internal
手动解析主机名时,出现错误
nslookup: write to '127.0.0.11': Connection refused
;; connection timed out; no servers could be reached
好吧,问题是 docker DNS 服务器已停止工作。所有已启动的容器仍然可以运行,但任何新启动的容器都会出现此问题。 我正在跑步
Docker version 19.03.6-ce, build 369ce74
我当然可以重新启动 docker 看看是否能解决问题,但我也很想了解为什么会发生这个问题以及将来如何避免它。
我在服务器上启动了很多容器,目前共有 25 个 docker 网络。
关于如何排除故障有什么想法吗?有任何已知问题可以解释这一点吗?
我使用的
docker-compose.yaml
文件之前已经工作过,并且没有对其进行任何更改。
编辑:根本无法解析 DNS 名称。 127.0.0.11 拒绝所有连接。我可以 ping 任何外部 IP 地址,以及同一 docker 网络上其他容器的 IP。只有 127.0.0.11 DNS 服务器不起作用。 127.0.0.11 仍然从容器内回复 ping。
我也有同样的问题。我使用 pihole/pihole docker 容器作为网络上唯一的 dns 服务器。与 pihole 服务器位于同一主机上的 Docker 容器无法解析域名。
我根据“hmario”对此论坛帖子的回复解决了该问题。
简单来说,将 pihole
docker-compose.yml
修改为:
---
version: '3.7'
services:
unbound:
image: mvance/unbound-rpi:1.13.0
hostname: unbound
restart: unless-stopped
ports:
- 53:53/udp
- 53:53/tcp
volumes: [...]
到
---
version: '3.7'
services:
unbound:
image: mvance/unbound-rpi:1.13.0
hostname: unbound
restart: unless-stopped
ports:
- 192.168.1.30:53:53/udp
- 192.168.1.30:53:53/tcp
volumes: [...]
其中
192.168.1.30
是docker主机的IP地址。
确保您使用的是自定义桥接网络,而不是默认网络。根据 Docker 文档 (https://docs.docker.com/network/bridge/),默认桥接网络不允许自动 DNS 解析:
默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link 选项,该选项被视为遗留。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。
我遇到了完全相同的问题。根据评论here我可以在没有docker-compose的情况下重现设置,仅使用docker:
docker network create alpine_net
docker run -it --network alpine_net alpine /bin/sh -c "cat /etc/resolv.conf; ping -c 4 www.google.com"
停止 docker (
systemctl stop docker
) 并启用它提供的调试输出
> dockerd --debug
[...]
[resolver] read from DNS server failed, read udp 172.19.0.2:40868->192.168.177.1:53: i/o timeout
[...]
其中
192.168.177.1
是我运行 docker 的主机的本地网络 IP,并且 pi-hole 作为 dns 服务器正在运行并适用于我的所有系统。
我尝试修复
iptables
配置。但即使完全关闭它们并打开所有内容也无济于事。
在没有完全理解根本情况的情况下,我找到的解决方案是将 dns 移至另一台服务器。我在第二个系统上安装了
dnsmasq
,ip 为 192.168.177.2,除了将所有 dns 查询转发回我在 192.168.177.1 上的 pi-hole 服务器
再次在 192.168.177.1 上启动
docker
,并将 DNS 配置为使用 192.168.177.2
一切都再次正常工作
在一个终端中使用此功能
dockerd --debug --dns 192.168.177.2
上面的命令又在另一个中起作用了。
> docker run -it --network alpine_net alpine /bin/sh -c "cat /etc/resolv.conf; ping -c 4 www.google.com"
search mydomain.local
nameserver 127.0.0.11
options ndots:0
PING www.google.com (172.217.23.4): 56 data bytes
64 bytes from 172.217.23.4: seq=0 ttl=118 time=8.201 ms
--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 8.201/8.201/8.201 ms
因此将 dns 服务器移至另一台主机并将
"dns" : ["192.168.177.2"]
添加到我的 /etc/docker/daemon.json
为我解决了这个问题
也许其他人可以帮我解释在与 docker 相同的主机上运行 dns 服务器时出现问题的根本原因。
我有同样的问题,问题是主机的主机名。我检查了
hostnamectl
结果,一切正常,但问题通过愚蠢的重启解决了。重新启动之前cat /etc/hosts
的结果是这样的:
# The following lines are desirable for IPv4 capable hosts
127.0.0.1 localhost HostnameSetupByISP
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
# The following lines are desirable for IPv6 capable hosts
::1 localhost HostnameSetupByISP
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
重启后,我得到了这个结果:
# The following lines are desirable for IPv4 capable hosts
127.0.0.1 hostnameIHaveSetuped HostnameSetupByISP
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
# The following lines are desirable for IPv6 capable hosts
::1 hostnameIHaveSetuped HostnameSetupByISP
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
首先,确保您的容器已连接到自定义桥接网络。我想默认情况下,容器内的自定义网络 DNS 请求将被发送到 127.0.0.11#53 并转发到主机的 DNS 服务器。
其次,检查
iptables -L
,看看是否有docker相关的规则。如果没有,可能是因为 iptables 被重新启动/重置。您需要重新启动 dockeremon 来重新添加规则才能使 DNS 请求转发正常工作。
您可以在 docker-compose.yml 中使用这样的构造 额外主机: - “your.domain.com:172.22.0.1” 这将在容器的 /etc/hosts 中添加一个条目 其中 ip 通常是容器的网关地址。 您可以通过以下方式查看: docker 检查容器名称 | grep 网关