WSL2中Docker .NET容器绑定80端口失败:地址已被占用
针对你遇到的Docker容器启动时Failed to bind to address http://[::]:80: address already in use错误,结合WSL2+Docker Desktop的环境,给出以下排查和解决步骤:
1. 排查Windows主机侧的80端口占用
WSL2的网络端口通过Windows主机转发,WSL内的lsof无法检测到Windows侧的端口占用。打开管理员权限的命令提示符,执行:
netstat -ano | findstr ":80"
找到输出中对应的PID,再执行:
tasklist /fi "pid eq [你的PID]"
即可查看占用80端口的Windows程序(比如IIS、Windows Update服务、第三方代理工具等),停止该程序后再尝试启动容器。
2. 修复WSL2端口转发冲突
Windows的端口转发规则可能出现异常,导致WSL的80端口被误占。打开管理员权限的PowerShell,执行:
Get-NetNatSession | Where-Object {$_.ExternalPort -eq 80}
如果有返回结果,说明存在转发冲突。执行以下命令关闭并重启WSL:
wsl --shutdown
重新打开WSL后再启动容器。
3. 重置Docker网络配置
Docker的网络缓存可能残留端口占用记录,执行以下命令清理无用网络:
docker network prune
然后重启Docker Desktop,再尝试启动容器。
4. 调整ASP.NET Core的绑定地址
修改Docker配置中的ASPNETCORE_URLS为:
- ASPNETCORE_URLS=https://+:443;http://0.0.0.0:80
明确绑定IPv4地址,避免IPv6的[::]:80端口冲突——部分Windows服务可能默认占用IPv6的80端口,但WSL内无法检测到。
5. 检查Windows HTTP服务占用
Windows的http.sys服务可能占用80端口,打开管理员命令提示符执行:
net stop http /y
强制停止该服务后尝试启动容器。如果后续需要恢复依赖服务,可以通过services.msc找到相关服务(比如World Wide Web Publishing Service、Windows Remote Management等)调整启动类型。
内容的提问来源于stack exchange,提问作者Ben Thomson

