启用服务时端口显示被占用?
netstat -ano | findstr ":<port>"没找到指定端口占用的进程
stackoverflow 对此类似问题的讨论:
- http://stackoverflow.com/questions/56705440/listen-eacces-permission-denied-0-0-0-08080
- https://stackoverflow.com/questions/54010365/how-to-see-what-is-reserving-ephemeral-port-ranges-on-windows
关于这个问题的描述和解决方案:
调查并释放端口
看起来 Hyper-V 会随机保留某些端口(或至少与 Hyper-V 相关)。使用命令netsh int ip show excludedportrange protocol=tcp确认无法使用的端口是否出现在输出列表中。
以下方法成功帮我释放了端口,操作并不复杂(25 人点赞):
这个问题通常由 Windows NAT 驱动(winnat)引起,停止并重启该服务可能解决问题:
net stop winnat
docker start ...
net start winnat提示
这里使用管理员权限运行,我使用net stop winnat && net start winnat解决了问题
完成后端口不再被占用,但我的 WSL2 终端失去了网络连接,因此需要重启以恢复所有功能。
永久保留指定端口
若不采取进一步措施,问题可能重现。例如,为未来使用保留端口 9012 和 9013(防止 winnat 占用):
netsh int ipv4 add excludedportrange protocol=tcp startport=9012 numberofports=2netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1 store=persistent(感谢@Venryx 提醒)
其他解决方案
在一个关于 Docker 无法开放端口的问题中(24 人点赞),此方法同样有效:
netcfg -d # 此命令会清理所有网络设备,需重启系统但有用户警告(4 人点赞),效果可能因人而异。我未注意到以下警告就执行成功了:
netcfg -d是危险命令,它损坏了我的 Docker 且无法启动,甚至重装 HyperV 和重启机器也无济于事。该命令似乎删除了多个网络适配器,重置容器和镜像后还引发了新问题。
另一个高赞回答(129 人点赞)提供了更复杂的方案,我未尝试:
@veqryn 的临时解决方案步骤如下:
- 禁用 Hyper-V(需多次重启):
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V- 完成重启后,永久保留目标端口(防止 Hyper-V 回收):
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1 store=persistent- 重新启用 Hyper-V(需多次重启):
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All系统恢复后即可成功绑定端口。
