docker-proxy获取accept4:错误的文件描述符

时间:2017-03-16 06:41:45

标签: docker proxy

我正在尝试使用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,build 60ccb22

1 个答案:

答案 0 :(得分:1)

我认为除了停止容器,将其删除然后再从Dockerfile开始运行,或者只是通过添加-p 8000:8000来运行docker之外,没有其他方法可以执行此操作。 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绑定到主机的端口,这意味着您可以控制过滤器表中的INPUT链上的流量(即主机本身)。 我仍然没有弄清楚为什么使用这种方式构建docker,但是默认情况下,如果您公开一个容器(使用-p),然后删除DNAT规则,它将仍然有效,因为请求将要按INPUT键。直接连锁。令人难以置信,但没关系。