我正在尝试使用 docker-proxy 将端口转发添加到 docker 容器,但遇到以下错误,
这是详细信息,
IP 172.17.0.2 的容器已在使用 --net=none 运行。我们提供自己的网络,而不是使用 docker0 网络。
现在我们想将容器的一些端口暴露给主机,所以想到尝试 docker-proxy。
我们执行了以下命令,
$ docker-proxy -container-ip 172.17.0.2 -container-port 8000 -host-ip 0.0.0.0 -host-port 8000 -proto tcp and we are getting, 2017/03/16 10:02:30 Stopping proxy on tcp/[::]:8001 for tcp/172.17.0.2:8001 (accept tcp [::]:8001: accept4: bad file descriptor)
Docker 版本:Docker 版本 17.03.0-ce,内部版本 60ccb22
最佳答案
我不认为有任何其他方法可以做到这一点,除了停止容器,删除它,然后从 Dockerfile 开始再次运行它,或者通过添加 -p 8000:8000 简单地使用 docker run 来运行它。 Docker 似乎不允许你直接修改 docker-proxy,你必须使用标准命令。
您还可以通过直接更改 iptables(即 NAT 表中的 DOCKER 链和过滤器中的 DOCKER 链)来手动将端口公开给外部访问。 例如:
iptables -t nat -A DOCKER ! -i your_bridge0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.2:8000
还有:
iptables -A DOCKER ! -i your_bridge0 -o your_bridge0 -d 172.17.0.2 -p tcp --m tcp --dport 80 -j ACCEPT
当然,你必须确保规则得到遵守,这完全是一个不同的问题。 Docker 似乎不太关心谁管理 iptables(ufw、firewalld 等)。
即使 docker proxy 根本没有运行,这也会起作用。 docker-proxy 绑定(bind)到主机的端口,这意味着您可以控制过滤器表中 INPUT 链上的流量(因此主机本身)。 我仍然没有弄清楚为什么 docker 是这样构建的,但默认情况下,如果你公开一个容器(使用 -p)然后删除 DNAT 规则,它仍然会工作,因为请求将命中 INPUT直接上链。这令人难以置信,但没关系。
关于docker-proxy 接受 Accept4 : bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826974/