【问题标题】:docker-compose internal DNS server 127.0.0.11 connection refuseddocker-compose 内部 DNS 服务器 127.0.0.11 连接被拒绝
【发布时间】:2022-04-22 14:28:39
【问题描述】:

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


【解决方案1】:

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

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

【讨论】:

  • 这是我在 Traefik 设置中遇到的问题,该设置有一些服务器的外部服务器和集群中所有容器的默认网络。我将默认网络更改为非默认名称,它们都可以相互 dns。以前只有 traefik 网络上的那些。
【解决方案2】:

我遇到了完全相同的问题。根据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 移动到另一台服务器。我在 IP 为 192.168.177.2 的第二个系统上安装了 dnsmasq,除了将所有 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 服务器问题背后的根本原因。

【讨论】:

    【解决方案3】:

    我也有同样的问题。我正在使用pihole/pihole docker 容器作为我网络上唯一的 dns 服务器。与 pihole 服务器在同一主机上的 Docker 容器无法解析域名。

    我根据“hmario”对this forum post的回复解决了这个问题。

    简而言之,将 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地址。

    【讨论】:

      【解决方案4】:

      我有同样的问题,问题是主机的主机名。我检查了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
      

      【讨论】:

        【解决方案5】:

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

        其次,查看iptables -L是否有docker相关的规则。如果没有,可能是因为 iptables 已重新启动/重置。您需要重新启动 docker demo 以重新添加规则以使 DNS 请求转发工作。

        猜你喜欢
        • 2021-08-16
        • 2022-01-02
        • 2016-11-28
        • 2021-10-12
        • 1970-01-01
        • 2022-08-05
        • 2018-10-23
        • 2016-03-08
        • 2017-08-05
        相关资源
        最近更新 更多