You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2镜像网络模式下Docker中XDebug连接PhpStorm问题求助

解决WSL2镜像网络下Docker容器XDebug连接Windows PhpStorm的动态IP问题

方案1:Docker Compose自动注入Windows主机IP

在docker-compose.yml中通过WSL命令动态获取Windows主机IP,直接传递给XDebug作为环境变量:

services:
  php-app:
    # 你的容器基础配置(镜像、卷挂载等)
    environment:
      # 动态获取WSL虚拟网卡对应的Windows主机IP
      - XDEBUG_CONFIG=client_host=$(powershell.exe -Command "Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias 'vEthernet (WSL)' | Select-Object -ExpandProperty IPAddress" | tr -d '\r') client_port=9003
      - XDEBUG_MODE=debug,develop

每次启动容器时都会自动抓取当前Windows主机的IP,无需手动修改配置。

方案2:WSL自动维护hosts映射,用固定域名访问Windows

  1. 创建WSL启动脚本/etc/profile.d/update-windows-host.sh:
#!/bin/bash
# 获取Windows主机的WSL网卡IP
WINDOWS_IP=$(powershell.exe -Command "Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias 'vEthernet (WSL)' | Select-Object -ExpandProperty IPAddress" | tr -d '\r')
# 删除旧的映射记录
sed -i "/windows-host/d" /etc/hosts
# 添加新的域名-IP映射
echo "$WINDOWS_IP windows-host" >> /etc/hosts
  1. 给脚本添加执行权限:
sudo chmod +x /etc/profile.d/update-windows-host.sh
  1. 容器内XDebug配置中指定固定域名:
# php.ini或xdebug.ini
xdebug.client_host=windows-host
xdebug.client_port=9003
xdebug.mode=debug,develop

每次WSL启动时,脚本会自动更新windows-host对应的IP,容器通过该域名就能稳定连接Windows上的PhpStorm。

方案3:调整iptables规则实现固定地址转发

基于你提供的iptables配置,添加转发规则让容器访问固定地址时自动跳转至Windows主机IP:

  1. 创建WSL启动脚本/etc/profile.d/xdebug-iptables.sh:
#!/bin/bash
# 获取Windows主机IP和WSL自身IP
WINDOWS_IP=$(hostname -I | awk '{print $1}')
WSL_IP=$(hostname -I | awk '{print $2}')
# 你的Docker容器子网(从iptables POSTROUTING中提取的172.18.0.0/16)
DOCKER_SUBNET=172.18.0.0/16
# 自定义固定转发地址(选未被占用的IP即可)
FORWARD_IP=192.168.200.2

# 删除旧规则(避免重复添加)
iptables -t nat -D PREROUTING -s $DOCKER_SUBNET -d $FORWARD_IP/32 -p tcp --dport 9003 -j DNAT --to-destination $WINDOWS_IP:9003 2>/dev/null
iptables -t nat -D POSTROUTING -s $DOCKER_SUBNET -d $WINDOWS_IP/32 -p tcp --dport 9003 -j SNAT --to-source $WSL_IP 2>/dev/null

# 添加新转发规则
iptables -t nat -A PREROUTING -s $DOCKER_SUBNET -d $FORWARD_IP/32 -p tcp --dport 9003 -j DNAT --to-destination $WINDOWS_IP:9003
iptables -t nat -A POSTROUTING -s $DOCKER_SUBNET -d $WINDOWS_IP/32 -p tcp --dport 9003 -j SNAT --to-source $WSL_IP
  1. 给脚本添加执行权限:
sudo chmod +x /etc/profile.d/xdebug-iptables.sh
  1. 容器内XDebug配置指定固定转发地址:
xdebug.client_host=192.168.200.2
xdebug.client_port=9003
xdebug.mode=debug,develop

规则生效后,容器发往192.168.200.2:9003的请求会自动转发到当前Windows主机的对应端口。

额外注意事项

  • 确认PhpStorm的XDebug监听设置为0.0.0.0:9003(路径:Settings > Languages & Frameworks > PHP > Debug)。
  • 若WSL防火墙拦截流量,可执行以下命令放行9003端口:
sudo iptables -A INPUT -p tcp --dport 9003 -j ACCEPT

内容的提问来源于stack exchange,提问作者Lyrositor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:43:12