WSL Docker 端口明明空闲,但就是绑不上端口
在 Windows 上使用 WSL2 + Docker 时,容器映射 MQTT 常用的 1883 端口,可能会遇到绑定失败的问题。奇怪的是,使用 netstat 或 lsof 检查时都看不到进程占用端口,但 Docker 仍然无法完成端口映射。
这通常不是端口被某个进程占用,而是 Windows 将该端口放进了 Excluded Port Range(保留端口范围)。保留范围内的端口在系统层面不可供 Docker 使用,因此检查进程时看起来是空闲的,实际却无法绑定。
解决方案
下面以 1883 端口为例。重启 NAT 服务会短暂中断 WSL 和 Docker 的网络连接,请先停止依赖这些网络的容器,并使用管理员身份打开命令提示符或 PowerShell。
重启 NAT 服务
执行以下命令:
cmd
net stop winnat
net start winnat
然后重新尝试启动容器并映射 1883 端口。
查看系统保留端口范围
如果重启 NAT 服务后仍然无法绑定,执行:
cmd
netsh interface ipv4 show excludedportrange protocol=tcp
检查输出的起止端口范围中是否包含 1883。例如,某个范围是 1800-1899 时,1883 就属于系统保留端口。