vscode远程调试docker内php应用的关键是打通路径映射、网络可达和模式兼容三环:xdebug 3需配置xdebug.mode=debug、xdebug.start_with_request=yes、xdebug.client_host=host.docker.internal(或宿主机ip)、xdebug.client_port=9003;launch.json中pathmappings必须精准对应容器内绝对路径与本地workspacefolder;容器须暴露9003端口且防火墙放行,日志/var/log/xdebug.log用于逐级排错。

要让 VSCode 通过 Xdebug 远程调试 Docker 容器里的 PHP 应用,关键不是堆配置,而是打通路径映射、网络可达和模式兼容这三环。Xdebug 3 之后的配置逻辑更清晰,但稍有偏差就会断点失灵——比如 VSCode 显示已连接却跳过断点,或日志里反复报 File not found。
确保 Xdebug 3 在容器内正确启用
别跳过验证步骤:进入容器执行 php -v 确认 Xdebug 已加载,再运行 php -i | grep xdebug 检查参数是否生效。推荐使用以下最小可行配置(保存为 /usr/local/etc/php/conf.d/xdebug.ini):
-
zend_extension=xdebug.so—— 必须放在最前,且路径准确(可用find /usr -name "xdebug.so" 2>/dev/null查找) -
xdebug.mode=debug—— 不要写成develop或漏掉debug -
xdebug.start_with_request=yes—— 避免依赖浏览器插件,请求一来就尝试连接 -
xdebug.client_host=host.docker.internal—— Docker Desktop/WSL 下有效;Linux 宿主机请改用宿主机真实 IP(如172.17.0.1) -
xdebug.client_port=9003—— 与 VSCode 的launch.json中端口严格一致 -
xdebug.log=/var/log/xdebug.log—— 开启后可直接tail -f /var/log/xdebug.log查错
VSCode launch.json 路径映射必须精准
这是断点不命中最常见的原因。容器内路径(serverSourceRoot)和本地项目路径(localSourceRoot)必须一一对应,且区分大小写、结尾斜杠、符号链接等细节。
- 若容器中代码在
/app,而你本地项目打开的是/Users/me/project,则pathMappings应写为:"pathMappings": { "/app": "${workspaceFolder}" } - 不要用相对路径或
~/,全部用绝对路径 - 如果用 Docker Compose 挂载了多个目录(如
-v ./src:/app/src),确保映射关系覆盖到断点所在文件的实际路径层级 - 可临时在 PHP 文件开头加
die(__FILE__);,访问接口看输出路径,反向确认映射是否对得上
检查网络连通性与端口暴露
Docker 默认隔离网络,Xdebug 从容器发请求到宿主机 VSCode,需确保链路畅通:
- 容器启动时必须暴露调试端口:Docker CLI 加
-p 9003:9003;Compose 中写ports: ["9003:9003"] - 防火墙要放行 9003(macOS/Windows 通常默认允许;Linux 可能需
sudo ufw allow 9003) - 在容器内测试能否连通宿主机:
ping host.docker.internal(或宿主机 IP),再试telnet host.docker.internal 9003(如无 telnet,可用apt install inetutils-ping netcat) - VSCode 启动调试前,务必先点击「开始调试」按钮(绿色三角),状态栏应显示「正在监听 9003 端口」
快速验证与排错流程
遇到断点无效,按顺序做这四步:
- 清空并重启:删掉
/var/log/xdebug.log,重启容器,再触发一次请求 - 看日志第一行:正常应有
[Step Debug] INFO: Connecting to configured address/port;若出现Could not connect to debugging client,说明网络或端口问题 - 看日志中间段:出现
Resolved path '/app/index.php' to '/Users/me/project/index.php'表示路径映射成功;若提示File not found,回去核对pathMappings - 最后检查 PHP 版本与 Xdebug 兼容性:用
php -r "echo XDEBUG_VERSION;"确认版本,再对照 xdebug.org/download 页面确认支持该 PHP 小版本











