解决:看我的评论。
我已阅读,How to access host port from docker container建议添加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访问localhost(主机)上的此端口?
答案 0 :(得分:0)
我现在如何允许docker访问localhost(主机)上的此端口?
如果您希望容器拥有自己的网络命名空间,则不能。单独的网络命名空间每个都有自己的命名空间环回接口(127.0.0.1),它与主机和其他容器不同。
当容器尝试与主机上的应用程序通信时,它将需要连接到主机的其中一个可路由IP。因此,您需要iptables规则,允许来自docker0接口的流量与您的其他接口通信,并且应用程序需要与主机接口通信,而不是127.0.0.1。
或者您可以跳过网络命名空间,使用--net host
将docker容器直接附加到主机的网络命名空间。这会删除一层容器隔离,并且不允许您使用docker网络与其他容器进行通信。但它确实允许您直接与容器内的127.0.0.1对话,并在主机上引用相同的环回接口。