0

我正在尝试从 Google Cloud Shell 内部(即在礼貌的 Google Compute Engine 实例上)运行 Docker 映像,如下所示:

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 之间的所有端口都可用,但运行仍然终止并显示以下错误消息:

来自守护进程的错误响应:无法启动容器:无法在网桥上创建端点:代理启动用户级代理超时

这里发生了什么?如何获得更多诊断信息并最终解决问题(即让我的 Docker 映像在整个可用端口范围内运行)。

4

1 回答 1

1

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

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

于 2016-07-17T19:19:43.703 回答