我正在尝试从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镜像在整个端口范围可用的情况下运行)。
答案 0 :(得分:1)
在Docker中打开一个范围内的端口目前还不能很好地扩展。上面将导致生成10,000个docker-proxy进程以支持每个端口,包括支持所有这些进程所需的所有文件描述符,以及添加的一长串防火墙规则。在某些时候,您将对文件描述符或进程达到资源限制。有关详细信息,请参阅issue 11185 on github。
在您控制的主机上运行时,唯一的解决方法是不分配端口并手动更新防火墙规则。不确定这甚至是GCE的一个选项。最佳解决方案是重新设计您的要求,以保持端口范围小。最后一个选项是完全绕过网桥并在主机网络上运行,在主机网络中没有--net=host
的代理和防火墙规则。后者删除了容器中的任何网络隔离,因此建议不要使用。