发布
社区首页 >问答首页 >docker-代理获取accept4:糟糕的文件描述符

docker-代理获取accept4:糟糕的文件描述符
EN

Stack Overflow用户
提问于 2017-03-16 06:41:44
回答 1查看 1.4K关注 0票数 6

我试图添加一个端口转发到码头集装箱使用码头代理,但遇到以下错误,

下面是细节,

  • IP 172.17.0.2的容器已经使用--net=none运行。我们正在提供我们自己的网络,而不是使用docker0网络。
  • 现在我们想公开一些港口的容器主机,所以考虑尝试码头-代理。
  • 我们执行了以下命令, $docker-代理容器-ip 172.17.0.2 -容器-端口8000 -主机-主机-端口8000 -proto tcp和我们得到,2017/03/16 10:02:30在tcp /:8001上停止tcp/172.17.0.2:8001 (接受tcp::8001: accept4:坏文件描述符)

Docker版本: Docker版本17.03.0-ce,构建60ccb22

EN

回答 1

Stack Overflow用户

发布于 2019-02-01 13:10:03

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

您还可以通过直接更改iptables (即NAT表中的DOCKER链和filter中的DOCKER链)来手动将端口公开给外部访问。例如:

代码语言:javascript
代码运行次数:0
复制
iptables -t nat -A DOCKER ! -i your_bridge0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.2:8000

和:

代码语言:javascript
代码运行次数:0
复制
iptables -A DOCKER ! -i your_bridge0 -o your_bridge0 -d 172.17.0.2 -p tcp --m tcp --dport 80 -j ACCEPT

当然,这样你就必须确保规则得到遵守,这完全是一个完全不同的问题。Docker似乎不太关心谁管理iptable (ufw,firewalld等)。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42826974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档