Joh*_*han 13 docker docker-compose
突然,当我使用 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
Run Code Online (Sandbox Code Playgroud)
好的,问题是 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。
小智 19
我也有同样的问题。我使用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: [...]
Run Code Online (Sandbox Code Playgroud)
到
---
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: [...]
Run Code Online (Sandbox Code Playgroud)
其中192.168.1.30是 docker 主机的 IP 地址。
确保您使用的是自定义桥接网络,而不是默认网络。根据 Docker 文档 ( https://docs.docker.com/network/bridge/ ),默认桥接网络不允许自动 DNS 解析:
默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link 选项,该选项被视为旧版。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。
小智 7
I'm having exactly the same problem. According to the comment here I could reproduce the setting without docker-compose, only using 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"
Run Code Online (Sandbox Code Playgroud)
stopping docker (systemctl stop docker) and enabling debug output it gives
> dockerd --debug
[...]
[resolver] read from DNS server failed, read udp 172.19.0.2:40868->192.168.177.1:53: i/o timeout
[...]
Run Code Online (Sandbox Code Playgroud)
where 192.168.177.1 is my local network ip for the host that docker runs on and where also pi-hole as dns server is running and working for all of my systems.
我尝试了修复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
Run Code Online (Sandbox Code Playgroud)
上面的命令又在另一个中起作用了。
> 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
Run Code Online (Sandbox Code Playgroud)
因此,将 dns 服务器移动到另一台主机并添加"dns" : ["192.168.177.2"]到我的/etc/docker/daemon.json修复中
也许其他人可以帮助我解释在与 docker 相同的主机上运行 dns 服务器的问题背后的根本原因。
| 归档时间: |
|
| 查看次数: |
8844 次 |
| 最近记录: |