You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker自定义bridge网络下容器仅单主机IP可访问的原因排查

Docker容器使用自定义Bridge网络后仅单个主机IP可访问的原因分析

我来帮你拆解这个问题的核心——这本质上是Docker自定义bridge网络的iptables规则默认行为导致的差异。

先对比两种网络的核心区别

  • 默认Docker bridge网络:当你不指定自定义网络时,容器使用的是Docker默认的bridge网络。Docker对这个默认网络的iptables规则配置是全局的:它会创建针对主机所有网络接口的端口转发规则(目标地址是0.0.0.0/0),所以不管你用主机上的哪个IP访问,流量都能被正确转发到容器里。

  • 自定义bridge网络:你创建的a-network-1属于自定义bridge网络,Docker对这类网络的iptables规则有不同的默认逻辑——它只会在主机的默认路由接口上配置端口转发的DNAT规则。也就是说,只有那个被系统设置为默认网关的网络接口对应的IP,能将外部流量转发到容器所在的自定义网络;而另一个非默认路由的接口,Docker并没有为它配置对应的转发规则,导致流量到达主机后无法路由到容器,最终出现访问超时。

验证方法(可以自己手动确认)

你可以在主机上执行iptables -t nat -L DOCKER命令查看规则:

  • 对于默认网络的端口转发,规则会是类似这样:

    -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:80
    这里的! -i docker0表示除了docker0接口外的所有接口都生效,所以所有主机IP都能访问。

  • 对于你的自定义a-network-1,规则会是类似这样:

    -A DOCKER -i eth0 -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.29.0.2:80
    这里的-i eth0表示仅绑定默认路由的网卡(比如eth0),所以只有这个网卡对应的IP能访问,另一个网卡的流量就没被处理。

总结

简单来说:自定义bridge网络的端口转发规则默认只关联主机的默认路由接口,非默认接口的流量无法被转发到容器所在的自定义网络,这就是为什么你只能通过其中一个IP访问容器的原因。

内容的提问来源于stack exchange,提问作者YannickTk

火山引擎 最新活动