【问题标题】:Docker run cannot publish port range despite netstat indicates that ports are available尽管 netstat 指示端口可用,但 Docker 运行无法发布端口范围
【发布时间】:2016-07-17 17:18:08
【问题描述】:

我正在尝试从 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 映像在整个可用端口范围内运行)。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • +1 感谢您的解释。我应该能够重新设计我的要求以保持端口范围小(呃)。但这似乎与手头的问题无关,Docker 似乎抱怨 10000-20000 范围内的端口被占用,而 netstat 不这么认为。我怎么能确定在较小的端口范围内也不会发生这种情况?
    • 我现在重新设计了我的需求(和 Dockerfile),以使用 10 个端口而不是 10000 个端口(现在应该这样做),问题已经“神奇地”消失了:docker run 不再产生错误。
    • “超时代理启动用户态代理”看起来不像是在抱怨端口被占用,而是说启动docker-proxy 进程花费了太长时间。可能时间过长,因为有 9,999 个其他进程试图同时启动,或者可能是文件描述符或其他资源耗尽的副作用。
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 2013-04-26
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多