已解决:请参阅我的评论。
我已经通读了,如何从 docker 容器访问主机端口,建议添加
iptables -A INPUT -i docker0 -j ACCEPT
的 iptable 规则,但是我只想在特定端口上允许这样做。
我有以下 iptable 规则:
-A INPUT -s 127.0.0.0/8 -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j DROP
因此,目的是仅允许来自 localhost 或 docker 容器的连接,而不允许外部连接到端口 3000。
我已经尝试过:
-A INPUT -p tcp -m tcp -i docker0 --dport 3000 -j ACCEPT
,但是在使用telnet 172.17.0.1 3000
检查时,这不允许从容器进行访问。
我现在如何允许 docker 访问本地主机(主机)上的此端口?
我现在如何允许 docker 访问本地主机(主机)上的此端口?
如果您希望容器拥有自己的网络命名空间,则不能这样做。每个单独的网络命名空间都有自己的命名空间环回接口 (127.0.0.1),该接口与主机和其他容器不同。
当容器尝试与主机上的应用程序通信时,它将需要连接到主机的可路由 IP 之一。因此,您需要 iptables 规则来允许来自 docker0 接口的流量与其他接口通信,并且应用程序需要与主机接口通信,而不是 127.0.0.1。
或者您可以跳过网络命名空间,使用
--net host
将 docker 容器直接附加到主机的网络命名空间。这消除了一层容器隔离,并且不允许您使用 docker 网络与其他容器通信。但它确实允许您直接与容器内的 127.0.0.1 通信,并使其引用主机上相同的环回接口。