WSL Docker 端口明明空闲,但就是绑不上端口

79 阅读1分钟

WSL Docker 端口明明空闲,但就是绑不上端口

在 Windows 上使用 WSL2 + Docker 时,容器映射 MQTT 常用的 1883 端口,可能会遇到绑定失败的问题。奇怪的是,使用 netstat 或 lsof 检查时都看不到进程占用端口,但 Docker 仍然无法完成端口映射。

这通常不是端口被某个进程占用,而是 Windows 将该端口放进了 Excluded Port Range(保留端口范围)。保留范围内的端口在系统层面不可供 Docker 使用,因此检查进程时看起来是空闲的,实际却无法绑定。

解决方案

下面以 1883 端口为例。重启 NAT 服务会短暂中断 WSL 和 Docker 的网络连接,请先停止依赖这些网络的容器,并使用管理员身份打开命令提示符或 PowerShell。

重启 NAT 服务

执行以下命令:

net stop winnat
net start winnat

然后重新尝试启动容器并映射 1883 端口。

查看系统保留端口范围

如果重启 NAT 服务后仍然无法绑定,执行:

netsh interface ipv4 show excludedportrange protocol=tcp

检查输出的起止端口范围中是否包含 1883。例如,某个范围是 1800-1899 时,1883 就属于系统保留端口。