端口不可用:监听tcp 0.0.0.0/50070: 绑定错误:尝试访问一种被其访问权限禁止的套接字。

111

我正在尝试使用以下命令启动一个Docker容器。

docker run -it -p 50070:50070 -p 8088:8088 -p 8080:8080 suhothayan/hadoop-spark-pig-hive:2.9.2 bash

最终出现了以下错误。

docker: 守护进程的错误响应:端口不可用:listen tcp 0.0.0.0/50070: bind: 尝试访问受其访问权限限制的套接字。

据我所理解,此错误是因为端口50070已经被其他进程占用。我尝试使用以下命令在命令提示符中查找该进程并将其关闭,但是它既没有输出也没有错误。

netstat -ano | findstr :50080

这个回答解决了你的问题吗?[尝试访问一个被其访问权限禁止的套接字] (https://dev59.com/U2Uo5IYBdhLWcg3w-zii) - Wickramaranga
12个回答

292

这个 解决方案帮助了我(以管理员身份运行你的终端):

net stop winnat
docker start container_name
net start winnat

17
这并不解释事情为什么会失败。 - Thorbjørn Ravn Andersen
2
谢谢,这对我很有帮助。我遇到了同样的错误,我在Windows PowerShell管理员模式下运行了第一个命令(net stop winnat),然后我运行了(docker-compose up --build -d),最后我运行了最后一个命令(net start winnat)。 - Aarony
对我也起作用了!非常感谢。 - Mustafa Yusuf
第一次遇到这个问题(尽管已经多次使用这个容器),今天在我的Windows 11机器(23H2,22631.2199)上遇到。这个修复方法起作用了,谢谢。 - Robin

95

我这样做是为了停止TCP进程 =>

  • net stop winnat
  • net start winnat

通过这种方式,繁忙的端口操作被终止。

对我来说有效。


1
谢谢!这个方法在Windows 10上对我有用。 - Charles Tempo

51
根据Windows Docker问题https://github.com/docker/for-win/issues/3171

你可能会发现该端口在命令netsh interface ipv4 show excludedportrange protocol=tcp的任何排除端口范围内。

您可以使用上述票证中提到的解决方案。

  1. 禁用Hyper-V(这将需要几次重启)

    dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

  2. 完成所有必需的重启后,保留您想要的端口,以便Hyper-V不会将其保留回来

    netsh int ipv4 add excludedportrange protocol=tcp startport=50070 numberofports=1

  3. 重新启用Hyper-V(这将需要几次重启)

    dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All


11

重新启动 winnat 不是一个好主意。根本原因是Windows的某些端口被动态保留,即使它们没有被占用。可以使用此命令来解决问题。

netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384

本文详细解释了如何完全解决Windows 10上端口绑定导致Docker容器无法启动或运行的问题,建议查看:Completely solve the problem of docker containers running on Windows 10 due to port binding

3
这个链接真的很有帮助,看起来是解决问题最合适的方式。禁用Hyper-V似乎有些过头并且需要额外的重新启动。 - beavel

4

当我的 VPN 连接处于活动状态时,我面临这种情况。
您可以暂时断开 VPN 连接,然后启动您的 docker 容器,之后再重新连接到 VPN。


4
  1. 运行命令net stop winnat
  2. 如果您使用Docker桌面版,请直接运行容器。否则在命令提示符下运行此命令:docker start <container_name>
  3. 运行命令net start winnat

2

我在本地机器上,使用Docker Desktop并启用Debian/Ubuntu作为默认发行版(将WSL2设置为所有内容的标准)时,遇到相似的问题。 我是这样解决的:

  • 禁用Docker设置中的“登录时启动Docker Desktop”
  • 重新启动Windows
  • 先启动Debian/Ubuntu
  • 然后启动Docker Desktop

2

这通常是由于Windows NAT驱动程序(winnat)引起的,停止并重新启动该服务可能会解决此问题。

以管理员身份打开Shell,并输入以下命令:

  1. net stop winnat。
  2. docker start ...
  3. net start winnat

1
这个答案已经在去年被Cepr0提供过了。 - Christopher Richmond
我喜欢两个答案,关键是你需要重新启动winnat服务,然后它将按照预期工作。 - Charles Tempo

2

1

尝试重新启动“主机网络服务”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接