Windows Docker - 端口被占用但 netstat 查不到进程的解决方法

在 Windows 上使用 Docker Desktop 时,本地服务可能报错提示端口被占用。此时执行 netstat -ano | findstr :8081 却返回空内容,无法定位占用端口的进程。本文记录这一问题的排查过程与解决方法。

问题现象

启动本地 Java 服务时,绑定 8081 端口失败,日志提示端口已被占用:

listen tcp 0.0.0.0:8081: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

按照常规的端口排查思路,在 CMD 中执行:

netstat -ano | findstr :8081

命令执行后没有任何输出。端口提示被占用,却查不到对应的进程,这也是本次排查中最难定位的一点。

问题原因

netstat -ano 只能列出被具体进程绑定的端口。Windows 上的 Docker 依赖 WinNAT 服务(Windows NAT 驱动)进行网络转发,该服务会预留一整段端口范围。这些端口落在系统的端口排除范围(Excluded Port Range)中,由系统保留,不会绑定到任何进程。

因此 netstat -ano | findstr :8081 查不到结果,并非命令有误,而是 8081 没有被进程占用,仅被 WinNAT 预留了。

可以通过以下命令查看当前被排除的端口范围:

netsh interface ipv4 show excludedportrange protocol=tcp

如果输出中包含 8081 所在的端口段,说明该端口被 WinNAT 预留。

解决方法

以管理员身份打开 CMD 或 PowerShell,依次执行以下命令重启 WinNAT 服务:

net stop winnat
net start winnat

服务重启后,被排除的端口范围会被重置,8081 恢复可用。

验证结果

再次查看排除的端口范围,确认 8081 已不在其中:

netsh interface ipv4 show excludedportrange protocol=tcp

确认端口被释放后,重新启动容器或本地服务即可正常绑定。