远程服务器上 Docker 内的 Xdebug 远程调试
Xdebug Remote Debugging inside Docker on remote server
我需要调试位于远程服务器上 Docker 容器内的 PHP 脚本。
通常,我使用 Visual Studio Windows 中的代码调试我的代码。我一直在用这种方式调试我的开发代码(位于 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 代码无法检测到调试会话。
基本上我做的是这些:
- 在我的本地机器上启动调试会话 (Windows)
- 使用
ssh -R 9000:localhost:9000 username@myremoteserver.com
创建到远程服务器的 ssh 隧道(将服务器上的端口 9000 转发到 localhost:9000)
- 将 Docker 上的端口 9000 映射到远程服务器上的端口 9000
- docker 中的 Xdebug 被设置为监听其主机(因此监听从 docker 内部看到的主机 IP 地址,这是我从 运行ning 从内部 docker:
/sbin/ip route|awk '/default/ { print }'
当我 运行 站点时,/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>
我如何 'relay' Xdebug 设置的连接从 Docker 到我的远程服务器,再到我本地电脑上的 IDE?
我无法通过 ssh-tunnel 做同样的事情:(
但是 ngrok 是可能的。你应该:
- 在您的本地开发机器上安装
ngrok
;
- 运行
ngrok tcp 9000
;
- 根据
ngrok
的信息设置xdebug.remote_port
和xdebug.remote_host
。
我需要调试位于远程服务器上 Docker 容器内的 PHP 脚本。
通常,我使用 Visual Studio Windows 中的代码调试我的代码。我一直在用这种方式调试我的开发代码(位于 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 代码无法检测到调试会话。
基本上我做的是这些:
- 在我的本地机器上启动调试会话 (Windows)
- 使用
ssh -R 9000:localhost:9000 username@myremoteserver.com
创建到远程服务器的 ssh 隧道(将服务器上的端口 9000 转发到 localhost:9000)
- 将 Docker 上的端口 9000 映射到远程服务器上的端口 9000
- docker 中的 Xdebug 被设置为监听其主机(因此监听从 docker 内部看到的主机 IP 地址,这是我从 运行ning 从内部 docker:
/sbin/ip route|awk '/default/ { print }'
当我 运行 站点时,/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>
我如何 'relay' Xdebug 设置的连接从 Docker 到我的远程服务器,再到我本地电脑上的 IDE?
我无法通过 ssh-tunnel 做同样的事情:(
但是 ngrok 是可能的。你应该:
- 在您的本地开发机器上安装
ngrok
; - 运行
ngrok tcp 9000
; - 根据
ngrok
的信息设置xdebug.remote_port
和xdebug.remote_host
。