V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xpke04
V2EX  ›  问与答

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

  •  
  •   xpke04 · 2017-10-27 14:47:34 +08:00 · 3186 次点击
    这是一个创建于 2586 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有机器 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 中访问,但也会导致全网都可以访问这个端口了。

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

    • 数据库等服务都正常启动了;
    • 默认情况下,任何容器中都无法通过主机 IP+端口 addA:27017 的方式访问容器中启动的数据库;
    • 在主机中使用主机 IP+端口 (addA:27017)可以访问数据库,在其他主机也可以;
    • 配置的 iptables 规则,iptables -I INPUT -s dockernet1/16 --dport 27017 -j ACCEPT 后,会导致全网都可以访问这个端口,即使设值了默认 DROP 掉白名单之外的链接;
    • 开放 iptables 后,尝试使用 tcpdump 抓包在容器中使用 addA:27017形式建立的链接,但是没有抓到任何包;

    请教一下大家:

    1. 为什么在其他主机上都可以通过 addA:27017 的方式访问这个数据库,但是在任何容器中都不行呢;
    2. 为什么上面设置的 iptables 会导致白名单之外的全网都可以访问这个端口;
    3. 为什么 tcpdump 抓包没有结果?
    4. 如何才能正确设置 docker 的网络和 iptables 规则呢?
    1 条回复    2017-10-27 15:01:13 +08:00
    xpke04
        1
    xpke04  
    OP
       2017-10-27 15:01:13 +08:00
    补充,docker 网络使用的是默认的 bridge 模式,另外,在容器中是能够访问主机上绑定的其他端口的服务的,但是不能访问容器 expose 出来的端口上的服务。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:30 · PVG 18:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.