docker代理获取accept4:错误的文件描述符

docker代理获取accept4:错误的文件描述符,docker,proxy,Docker,Proxy,我正在尝试使用docker proxy将端口转发添加到docker容器,但在下面遇到此错误 以下是详细情况 IP为172.17.0.2的容器已在使用--net=none运行。我们提供自己的网络,不使用docker0网络 现在我们想向主机公开容器的一些端口,所以考虑尝试docker代理 我们执行了下面的命令 $ docker-proxy -container-ip 172.17.0.2 -container-port 8000 -host-ip 0.0.0.0 -host-port 8000

我正在尝试使用docker proxy将端口转发添加到docker容器,但在下面遇到此错误

以下是详细情况

  • IP为172.17.0.2的容器已在使用--net=none运行。我们提供自己的网络,不使用docker0网络

  • 现在我们想向主机公开容器的一些端口,所以考虑尝试docker代理

  • 我们执行了下面的命令

    $ 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,build 60ccb22

我认为除了停止容器,移除它,然后从Docker文件开始再次运行它,或者简单地通过添加-p 8000:8000来运行Docker之外,没有其他方法可以做到这一点。 Docker似乎不允许您直接修补Docker代理,您必须使用标准命令

您还可以通过直接更改iptable(即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
以及:

当然,然后你必须确保这些规则会被遵守,这是一个完全不同的问题。Docker似乎并不太关心谁来管理iptables(ufw、firewalld等)

即使docker代理根本没有运行,这也会起作用。docker proxy绑定到主机的端口,这意味着您可以控制筛选器表中输入链上的流量(因此主机本身也是如此)。 我还没有弄明白为什么docker是以这种方式构建的,但是默认情况下,如果您公开一个容器(使用-p),然后删除DNAT规则,它仍然可以工作,因为请求将直接命中输入链。这令人难以置信,但没关系

iptables -A DOCKER ! -i your_bridge0 -o your_bridge0 -d 172.17.0.2 -p tcp --m tcp --dport 80 -j ACCEPT