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

时间:2016-07-17 17:18:09

标签: docker google-compute-engine google-kubernetes-engine google-cloud-shell

我正在尝试从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镜像在整个端口范围可用的情况下运行)。

1 个答案:

答案 0 :(得分:1)

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

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