docker-proxy 接受 Accept4 : bad file descriptor

标签 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,内部版本 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/

相关文章:

Docker - 是否可以重新创建卷容器而不重新创建使用它的容器

java - 如何运行 Docker 容器但不复制密码文件来组装镜像,还有其他选项吗?

docker - 如何在多阶段docker build中访问克隆的git repo?

java - 通过代理连接到远程 weblogic 服务器时出现问题

java - URL(url).openStream() 与代理

selenium - 如何使用代理运行 selenium chrome 节点?

Java SOCKS 代理

docker - Docker Swarm 集群设置的单一脚本

java - 在 KeyVaultClient java 中将代理设置为 AuthenticationContext 没有效果

django - PermissionError:[Errno 13]尝试使用docker-compose创建项目时,权限被拒绝: '/app/manage.py'