docker-compose内部DNS服务器127.0.0.11连接被拒绝

问题描述 投票:0回答:6

突然,当我使用 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。

docker docker-compose
6个回答
22
投票

我也有同样的问题。我使用 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地址。


10
投票

确保您使用的是自定义桥接网络,而不是默认网络。根据 Docker 文档 (https://docs.docker.com/network/bridge/),默认桥接网络不允许自动 DNS 解析:

默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link 选项,该选项被视为遗留。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。


7
投票

我遇到了完全相同的问题。根据评论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 服务器时出现问题的根本原因。


1
投票

我有同样的问题,问题是主机的主机名。我检查了

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

0
投票

首先,确保您的容器已连接到自定义桥接网络。我想默认情况下,容器内的自定义网络 DNS 请求将被发送到 127.0.0.11#53 并转发到主机的 DNS 服务器。

其次,检查

iptables -L
,看看是否有docker相关的规则。如果没有,可能是因为 iptables 被重新启动/重置。您需要重新启动 dockeremon 来重新添加规则才能使 DNS 请求转发正常工作。


0
投票

您可以在 docker-compose.yml 中使用这样的构造 额外主机: - “your.domain.com:172.22.0.1” 这将在容器的 /etc/hosts 中添加一个条目 其中 ip 通常是容器的网关地址。 您可以通过以下方式查看: docker 检查容器名称 | grep 网关

© www.soinside.com 2019 - 2024. All rights reserved.