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
的主机网络上。后者会删除您在容器中的任何网络隔离,因此往往不被推荐。
我正在尝试从 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
的主机网络上。后者会删除您在容器中的任何网络隔离,因此往往不被推荐。