【问题标题】:docker-proxy getting accept4: bad file descriptordocker-proxy 得到 accept4:错误的文件描述符
【发布时间】:2017-03-16 06:41:44
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: docker proxy


    【解决方案1】:

    我认为除了停止容器,删除它,然后从 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 代理根本没有运行。 docker-proxy 绑定到主机的端口,这意味着您控制过滤表中 INPUT 链上的流量(因此主机本身)。 我还没有弄清楚为什么 docker 是这样构建的,但是默认情况下,如果你暴露一个容器(使用 -p)然后你删除 DNAT 规则,它仍然可以工作,因为请求会命中 INPUT直接上链。这令人难以置信,但没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多