背景: 宿主机 IP 为 10.0.0.1 ,容器部署在宿主机的默认网桥上,容器 A 的 ip 为 172.17.0.2 ,容器 B 的 ip 为 172.17.0.3 宿主机的端口 50000 映射到容器 A 中 已知现象: 在外部 PC 上可以通过 telnet 10.0.0.1 50000 访问到容器 A 的 50000 端口 在宿主机上可以通过 telnet 10.0.0.1 50000 访问到容器 A 的 50000 端口 在宿主机上可以通过 telnet 172.17.0.2 50000 访问到容器 A 的 50000 端口 在容器 B 中,可以通过 telnet 172.17.0.2 50000 访问到容器 A 的 50000 端口 问题是: 在容器 B 中,无法通过 telnet 10.0.0.1 50000 访问到容器 A 的 50000 端口
iptables 表项如下
Chain PREROUTING (policy ACCEPT 6203 packets, 511K bytes)
pkts bytes target prot opt in out source destination
52 3088 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128 LOG flags 0 level 4 prefix "PREROUTING: "
4215 189K DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
3 180 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
49 2964 RETURN all -- br-9950295a8b77 * 0.0.0.0/0 0.0.0.0/0
2 88 DNAT tcp -- !br-9950295a8b77 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8800 to:172.16.0.88:80
10 568 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50000 to:172.17.0.2:50000
从规则来看,理解是 docker0 中发来的包在命中 DNAT 规则前就 RETURN 了,为什么会这样呢,是鼓励容器网络中互访应该直接使用容器自身的 IP 吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.