【发布时间】:2020-07-18 09:04:31
【问题描述】:
情况:我有一个在 docker 容器内运行的服务,该服务托管在 DSM 包管理器中提供的官方 Synology docker 包中。此服务需要 http-connect 到另一个服务,该服务不在 docker 中运行,但恰好托管在同一台 Synology 主机上(相同的 LAN IP 地址)。与服务的 http 连接始终超时。
Obervations: 对此进行调查,我发现我可以从容器 ping 局域网上的任何其他 IP(例如 192.168.1.4),但可以 ping 到容器的主机 IP (192.168.1.2)超时。我的防火墙启用了 ICMP。
问题:为什么容器ping不通主机IP?
示例:以下简单示例总结了问题:
root@synology# docker run --name test -ti ubuntu /usr/bin/env sh
# apt-get update
[...]
# apt-get install iputils-ping
[...]
# ping 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
64 bytes from 192.168.1.4: icmp_seq=1 ttl=63 time=0.309 ms
64 bytes from 192.168.1.4: icmp_seq=2 ttl=63 time=0.420 ms
64 bytes from 192.168.1.4: icmp_seq=3 ttl=63 time=0.316 ms
^C
--- 192.168.1.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.309/0.348/0.420/0.050 ms
# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
^C
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
# exit
我尝试了什么:
- 从 shell 直接在主机上运行 Ping 主机 IP - 有效:
root@synology# ping 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.044 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.023 ms ^C --- 192.168.1.2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.023/0.033/0.044/0.012 ms - 禁用防火墙 - 无效,仍然无法从容器内部 ping 192.168.1.2
- 在我的 Windows 桌面 (192.168.1.101) 上运行相同 - 从该机器上 Docker 桌面中托管的 docker 容器 ping 到 192.168.1.101 回声就好了:
d:\>ipconfig [...] Ethernet adapter Ethernet: Connection-specific DNS Suffix . : home Link-local IPv6 Address . . . . . : [...] IPv4 Address. . . . . . . . . . . : 192.168.1.101 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.1.1 [...] d:\>docker run --name test -ti ubuntu /usr/bin/env sh [...] # whoami root # apt-get update [...] # apt-get install iputils-ping [...] # ping 192.168.1.101 PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data. 64 bytes from 192.168.1.101: icmp_seq=1 ttl=37 time=0.627 ms 64 bytes from 192.168.1.101: icmp_seq=2 ttl=37 time=2.51 ms 64 bytes from 192.168.1.101: icmp_seq=3 ttl=37 time=1.51 ms ^C --- 192.168.1.101 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2041ms rtt min/avg/max/mdev = 0.627/1.548/2.509/0.768 ms # exit - 检查内部 IP 冲突:桥接网络容器正在连接到正在运行的子网
172.17.0.0/16,因此不会与 LAN 子网发生冲突。我还检查了与其他容器的冲突。
我没有对我的 Synology docker 包进行任何特殊调整,所有东西都是开箱即用的(除了我在那里安装的)。我没有使用,甚至没有尝试在盒子上配置 swarm 或 Kubernetes。只是码头工人。
我束手无策。为什么我无法 ping / 连接到主机 IP?
【问题讨论】:
标签: docker networking synology