docker 中多个容器访问 expose 端口的诡异问题

2017-10-27 14:47:34 +08:00
 xpke04

现有机器 A,单网卡地址为 addA

机器上有两组容器,一组使用 docker-compose 编排,网段为dockernet1,另一组使用 docker run 运行,为 mongodb,mysql 之类的,网段为dockernet2,暴露出的端口有 3306,27017 等。

现在发现,在不设值任何 iptables 规则的默认情况下,dockernet1中容器的应用无法通过机器的 IP+暴露出的端口(addA:27017)访问dockernet2中的容器的数据库。但是如果我设值了iptables -I INPUT -p tcp -s dockernet1/16 --dport 27017 -j ACCEPT 之后,虽然可以从 dockernet1 中访问,但也会导致全网都可以访问这个端口了。

经过测试尝试,我发现了如下现象:

请教一下大家:

  1. 为什么在其他主机上都可以通过 addA:27017 的方式访问这个数据库,但是在任何容器中都不行呢;
  2. 为什么上面设置的 iptables 会导致白名单之外的全网都可以访问这个端口;
  3. 为什么 tcpdump 抓包没有结果?
  4. 如何才能正确设置 docker 的网络和 iptables 规则呢?
3111 次点击
所在节点    问与答
1 条回复
xpke04
2017-10-27 15:01:13 +08:00
补充,docker 网络使用的是默认的 bridge 模式,另外,在容器中是能够访问主机上绑定的其他端口的服务的,但是不能访问容器 expose 出来的端口上的服务。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX