WSL2环境下Docker运行镜像时端口未在宿主机发布如何解决?

问题原因
- WSL2默认采用NAT网络架构,若Docker Desktop开启WSL2集成后端口转发规则未自动同步到Windows宿主机,会导致端口无法被宿主机直接访问
- Windows防火墙拦截了WSL2网卡的入站流量,对应端口的访问请求被阻止
- 启动Docker容器时仅绑定了127.0.0.1地址,仅对WSL2内部回环地址生效,未暴露到外部网卡
- WSL2 IP为动态分配,每次重启WSL2后IP会变更,之前手动配置的端口转发规则会自动失效
- 容器内部的服务仅监听了容器内的127.0.0.1回环地址,未监听0.0.0.0,外部请求无法送达服务进程
解决方案
修正Docker端口绑定规则
启动容器时指定绑定所有网卡,命令示例:docker run -p 0.0.0.0:宿主机端口:容器端口 镜像名称
若使用Docker Compose,修改ports配置:
ports: - "0.0.0.0:宿主机端口:容器端口"
手动配置WSL2到Windows的端口转发
- 在WSL2终端执行
ip addr show eth0,获取inet字段下的WSL2内网IP,示例格式为172.x.x.x - 打开Windows管理员权限PowerShell,执行端口转发命令:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=宿主机端口 connectaddress=上述WSL2IP connectport=容器映射端口 - 放行Windows防火墙对应端口规则:
New-NetFirewallRule -DisplayName "WSL2端口放行" -Direction Inbound -LocalPort 宿主机端口 -Protocol TCP -Action Allow
修改容器内服务监听地址
确认容器内运行的业务服务监听地址为0.0.0.0,而非127.0.0.1,不同服务修改方式不同:
- Nginx需修改配置文件中listen对应的绑定地址
- Node/Java等后端服务需指定启动host为0.0.0.0
重置WSL2网络配置
如果之前开启过WSL2镜像网络模式,会导致端口转发异常,打开Windows路径下%UserProfile%\.wslconfig文件,删除或注释以下配置:
[experimental] networkingMode=mirrored
修改完成后执行wsl --shutdown重启WSL2即可生效。
重置Docker WSL2集成
打开Docker Desktop设置页,进入Resources->WSL Integration,关闭对应WSL发行版的集成开关,点击应用后重新打开开关再次应用,重启Docker后重试即可。
内容的提问来源于stack exchange,提问作者F.P
相关产品推荐
相关产品推荐

