WSL中Docker容器内Caddy服务无法从Windows访问的排查求助
问题:WSL2镜像模式下Windows无法访问Docker容器8080端口
环境配置
- WSL2运行Linux环境,
.wslconfig配置如下:
[wsl2] networkingMode=mirrored
- 部署服务:
- 直接运行在WSL Linux中、监听80端口的
linux-app - 以Docker容器运行(Caddy)、监听8080端口的
docker-app,采用双宿主网络模式,其中一个网络为internal(用于反向代理)
- 直接运行在WSL Linux中、监听80端口的
过往正常表现
此前一年时间内,跨系统访问均正常:
# Linux端访问正常 $ chromium http://localhost:80 # works fine on linux $ chromium http://localhost:8080 # works fine on linux # Windows端访问正常 C:\start edge http://localhost:80 # works fine on Windows C:\start edge http://localhost:8080 # works fine on Windows
确认docker-compose.yml的端口映射配置正确。
当前异常情况
全新部署相同环境(应用、镜像、docker-compose.yml完全一致)后,出现端口访问差异:
# Linux端访问仍正常 $ chromium http://localhost:80 # works fine on linux $ chromium http://localhost:8080 # works fine on linux # Windows端访问8080端口超时 C:\start edge http://localhost:80 # works fine on Windows C:\start edge http://localhost:8080 # timeout,错误码ERR_CONNECTION_TIMED_OUT
- Windows下Edge、curl均在21秒后超时,
curl --verbose无额外有效信息 - Caddy已开启详细日志,但未收到来自Windows的请求
现有限制与排查进展
无Windows管理员权限,仅可执行Get-NetFirewallRule -Enabled True命令,不清楚需筛选的关键词
排查思路与解决方案
1. 验证Docker端口映射的绑定地址
确认docker-compose.yml中8080端口的映射绑定到0.0.0.0而非仅127.0.0.1,示例配置:
ports: - "0.0.0.0:8080:8080"
镜像模式下对绑定地址敏感度更高,需确保容器端口对外开放到所有接口。
2. 检查WSL2端口转发状态
在WSL Linux中执行以下命令,确认8080端口是否被正确转发:
sudo ss -tulpn | grep 8080
查看输出是否存在0.0.0.0:8080的监听记录,且对应进程为docker-proxy。
3. 无权限下排查Windows防火墙规则
使用以下PowerShell命令筛选相关规则:
# 筛选含WSL关键词的启用规则 Get-NetFirewallRule -Enabled True | Where-Object { $_.DisplayName -match "WSL" } # 筛选含Docker关键词的启用规则 Get-NetFirewallRule -Enabled True | Where-Object { $_.DisplayName -match "Docker" } # 筛选与8080端口相关的入站规则 Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq 8080 } | Get-NetFirewallRule | Where-Object { $_.Enabled -eq $true }
若未找到允许8080端口入站的规则,需联系管理员添加对应规则。
4. 测试WSL IP直连
先在WSL中获取自身IP:
hostname -I
然后在Windows中执行:
curl http://<WSL_IP>:8080
若能访问,说明localhost端口转发存在问题,可尝试重启WSL:
wsl --shutdown
之后重新启动WSL即可。
5. 检查Docker容器网络配置
执行以下命令查看Caddy容器的网络详情:
docker inspect <caddy_container_name> | grep -A 20 "Networks"
确认非internal网络的Gateway和IPAddress为WSL可访问的地址,且容器端口绑定到该网络接口。
内容的提问来源于stack exchange,提问作者Patrick Fromberg
相关产品推荐
相关产品推荐

