Docker 运行 无法发布端口范围,尽管 netstat 指示端口可用

Docker run cannot publish port range despite netstat indicates that ports are available

我正在尝试从 Google 云 Shell 中 运行 Docker 图像(即出于礼貌 Google Compute Engine 实例),如下所示:

docker run -d -p 20000-30000:10000-20000 -it <image-id> bash -c bash

在此步骤之前,netstat -tuapn 报告了以下内容:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:8998          0.0.0.0:*               LISTEN      249/python      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:13080           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:13081           0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:34490         0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:13082           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:13083           0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:13084           0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:34490         127.0.0.1:48161         ESTABLISHED -               
tcp        0    252 172.17.0.2:22           173.194.92.34:49424     ESTABLISHED -               
tcp        0      0 127.0.0.1:48161         127.0.0.1:34490         ESTABLISHED 15784/python    
tcp6       0      0 :::22                   :::*                    LISTEN      -     

所以在我看来,好像 20000 到 30000 之间的所有端口都可用,但是 运行 仍然终止,并显示以下错误消息:

Error response from daemon: Cannot start container : failed to create endpoint on network bridge: Timed out proxy starting the userland proxy

这是怎么回事?我怎样才能获得更多的诊断信息并最终解决问题(即将我的 Docker 图像变为 运行 并且整个端口范围都可用)。

目前在 Docker 中无法很好地扩展某个范围内的端口。以上将导致生成 10,000 个 docker-proxy 进程以支持每个端口,包括支持所有这些进程所需的所有文件描述符,以及添加的一长串防火墙规则。在某些时候,您会遇到文件描述符或进程的资源限制。有关详细信息,请参阅 issue 11185 on github

在您控制的主机上 运行ning 时,唯一的解决方法是不分配端口并手动更新防火墙规则。不确定这是否是 GCE 的一个选项。最好的解决方案是重新设计您的要求以保持端口范围较小。最后一个选项是完全绕过桥接网络和 运行 在没有更多代理和防火墙规则 --net=host 的主机网络上。后者会删除您在容器中的任何网络隔离,因此往往不被推荐。