远程服务器上 Docker 内的 Xdebug 远程调试
Posted
技术标签:
【中文标题】远程服务器上 Docker 内的 Xdebug 远程调试【英文标题】:Xdebug Remote Debugging inside Docker on remote server 【发布时间】:2018-10-19 03:14:25 【问题描述】:我需要调试位于远程服务器上 Docker 容器内的 php 脚本。
通常,我在 Windows 中使用 Visual Studio Code 调试我的代码。我一直在以这种方式调试我的开发代码(位于 Vagrant 中),没有任何问题。
但是当涉及到在远程服务器上的 Docker 中调试文件时,我无法让它工作。
这是我在 php.ini 上的 xdebug 设置(在位于远程服务器上的 docker 中)
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host=172.18.0.1
xdebug.remote_port=9000
xdebug.remote_log=/tmp/debug.log
上面设置中的remote_host
IP 地址是从 Docker 内部看到的远程主机的 IP。
我已经尝试通过 ssh 隧道连接到我的远程服务器(从 Windows,使用 telnet)。
但是当我尝试在浏览器上运行该站点时,我的 Visual Studio Code 无法检测到调试会话。
基本上我做的是这些:
-
在我的本地计算机 (Windows) 上启动调试会话
使用
ssh -R 9000:localhost:9000 username@myremoteserver.com
创建到远程服务器的ssh-tunnel(将服务器上的端口9000转发到localhost:9000)
将 Docker 上的 9000 端口映射到远程服务器上的 9000 端口
docker 中的 Xdebug 设置为侦听其主机(因此从 docker 内部看到的主机 IP 地址,我从 docker 内部运行此命令得到:/sbin/ip route|awk '/default/ print $3 '
当我运行该站点时,/tmp/debug.log
包含以下内容:
I: Connecting to configured address/port: 172.18.0.1:9000.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///magento/test.php" language="PHP" xdebug:language_version="5.6.33-1+ubuntu16.04.1+deb.sury.org+1" protocol_version="1.0" appid="12776" idekey="www-data"><engine version="2.5.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2017 by Derick Rethans]]></copyright></init>
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>
如何将 Xdebug 设置的连接从 Docker“中继”到我的远程服务器,再到我本地电脑上的 IDE?
【问题讨论】:
不要使用标准的 9000 端口——最好选择 9001 或其他端口。现在,一些知道 Xdebug 是什么以及它是如何工作的服务正在响应 Xdebug 连接(根据您的日志),并简单地告诉 Xdebug“离开”(通过说“在没有调试的情况下运行直到结束”)。如果您使用了错误的 IP 地址,它很可能是 php-fpm。另外,不知道172.18.0.1
是从哪里来的——对于SSH 隧道,你真的应该使用127.0.0.1
。
1) “docker 中的 Xdebug 设置为监听它的主机” 什么?请RTM。 Xdebug 什么都不听。仅仅是因为它是 Xdebug 连接到 IDE 而不是其他方式... 2) IP 地址必须是运行 IDE/编辑器的 PC 的地址(如果您愿意并且可以直接连接)。否则你需要 SSH 隧道...然后你需要使用 127.0.0.1 以便连接从远程系统转发到你的开发 PC。
3) 现在你必须只连接到本地(远程)php-fpm 或一些 Xdebug 感知的类似服务(知道它是如何工作的)......因为它清楚地告诉 Xdebug “走开”。
1) RTM: xdebug.org/docs/remote 2) 它适用于 PhpStorm .. 但也适用于 VSCode(因为任何 IDE/编辑器的基础都是相同的):confluence.jetbrains.com/display/PhpStorm/…
***.com/questions/53496300/…的可能重复
【参考方案1】:
我没有成功通过 ssh-tunnel 做同样的事情:(
但ngrok 是可能的。你应该:
-
在本地开发机器上安装
ngrok
;
运行ngrok tcp 9000
;
根据ngrok
的信息设置xdebug.remote_port
和xdebug.remote_host
。
【讨论】:
以上是关于远程服务器上 Docker 内的 Xdebug 远程调试的主要内容,如果未能解决你的问题,请参考以下文章
在 docker 内的远程机器上使用 PyCharm 的远程调试器
从 Docker 容器内部使用 XDebug 进行远程调试不起作用