docker容器中的Xdebug无法连接到Qubes操作系统上的PhpStorm


Docker容器中的Xdebug无法连接到我的系统上的PhpStorm。

我正在尝试用PhpStorm为Linux上的Docker环境(qubesos/Fedora 30(设置Xdebug。Xdebug已启用,我可以访问错误消息。在PhpStorm中,我总是用我作为远程主机给Xdebug的相应IP更新DBGp代理设置。我尝试了许多版本的Xdebug设置,但都失败了。

我目前的最佳猜测是内部IP管理出现了问题。这可能是由于qubes os,但我真的不相信,因为这是一个正常的Fedora,我以前从未遇到过这样的问题。。。

我的Xdebug-conf

zend_extension=xdebug.so
[Xdebug]
xdebug.idekey=PHPSTORM
xdebug.remote_enable=true
xdebug.remote_port=5902
xdebug.remote_host=host.docker.internal
xdebug.remote_log=/tmp/xdebug-remote.log

(我知道host.docker.internal不适用于Linux。无论如何,我都在使用它,通过在docker容器的/etc/hosts文件中为此变量设置IP来简化调试(

我的phpinfo((

xdebug support  enabled
Version 2.6.1
IDE Key PHPSTORM
xdebug.remote_enable    On  On
xdebug.remote_handler   dbgp    dbgp
xdebug.remote_host  host.docker.internal    host.docker.internal
xdebug.remote_log   /tmp/xdebug-remote.log  /tmp/xdebug-remote.log
xdebug.remote_mode  req req
xdebug.remote_port  5902    5902
xdebug.remote_timeout   200 200

我的web-log告诉我的请求来自172.18.0.1 - - [31/Oct/2019:09:58:22 +0000] "GET / HTTP/1.1" 200 47698 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"

myifconfig输出主机

br-8d5002ad7a3a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
inet6 fe80::42:17ff:feaa:e865  prefixlen 64  scopeid 0x20<link>
ether 02:42:17:aa:e8:65  txqueuelen 0  (Ethernet)
RX packets 5  bytes 513 (513.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 11  bytes 866 (866.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
inet6 fe80::42:99ff:fe38:e669  prefixlen 64  scopeid 0x20<link>
ether 02:42:99:38:e6:69  txqueuelen 0  (Ethernet)
RX packets 4055  bytes 233615 (228.1 KiB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 4367  bytes 55073512 (52.5 MiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.137.0.17  netmask 255.255.255.255  broadcast 10.255.255.255
inet6 fe80::216:3eff:fe5e:6c00  prefixlen 64  scopeid 0x20<link>
ether 00:16:3e:5e:6c:00  txqueuelen 1000  (Ethernet)
RX packets 555370  bytes 785064402 (748.6 MiB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 208464  bytes 13235820 (12.6 MiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
inet 127.0.0.1  netmask 255.0.0.0
inet6 ::1  prefixlen 128  scopeid 0x10<host>
loop  txqueuelen 1000  (Local Loopback)
RX packets 107  bytes 227427 (222.0 KiB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 107  bytes 227427 (222.0 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
veth0271483: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet6 fe80::183d:fdff:fe2b:f8ce  prefixlen 64  scopeid 0x20<link>
ether 1a:3d:fd:2b:f8:ce  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 16  bytes 1379 (1.3 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
veth25193ce: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet6 fe80::603c:beff:fe87:6283  prefixlen 64  scopeid 0x20<link>
ether 62:3c:be:87:62:83  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 16  bytes 1379 (1.3 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
vetha36c6d7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet6 fe80::789d:60ff:fe15:8eb4  prefixlen 64  scopeid 0x20<link>
ether 7a:9d:60:15:8e:b4  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 16  bytes 1379 (1.3 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
vethc039300: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet6 fe80::a0a9:4eff:fe3d:8338  prefixlen 64  scopeid 0x20<link>
ether a2:a9:4e:3d:83:38  txqueuelen 0  (Ethernet)
RX packets 5  bytes 513 (513.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 11  bytes 866 (866.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
vethe777af4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet6 fe80::c07e:11ff:fe1a:9f6b  prefixlen 64  scopeid 0x20<link>
ether c2:7e:11:1a:9f:6b  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 16  bytes 1379 (1.3 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

码头集装箱上的myifconfig输出

eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:05  
inet addr:172.18.0.5  Bcast:172.18.255.255  Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0 
RX bytes:1260 (1.2 KiB)  TX bytes:0 (0.0 B)
lo        Link encap:Local Loopback  
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000 
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我的主机上的netstat -ltn

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:10137           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:20080           0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::9000                 :::*                    LISTEN     
tcp6       0      0 :::3306                 :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::81                   :::*                    LISTEN     
tcp6       0      0 :::8082                 :::*                    LISTEN    

码头集装箱的我的netstat -ltn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 127.0.0.11:34183        0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9001            0.0.0.0:*               LISTEN    

当使用xdebug.remote_connect_back=1时,我得到

I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 172.18.0.1:5902.
E: Time-out connecting to client (Waited: 200 ms). :-(
Log closed at 2019-10-31 09:32:55

此外,当我在docker容器中运行netstat -nr | grep '^0.0.0.0' | awk '{print $2}'时,我得到172.18.0.1

因此,我认为xdebug.remote_host = 172.18.0.1

但是,当我使用docker添加到容器的/etc/hosts的IP(IP更改为172.17-18.0.1-4,现在是172.18.0.4(并查看Xdebug日志时,我得到了

W: Creating socket for 'host.docker.internal:5902', poll success, but error: Operation in progress (29).
E: Could not connect to client. :-(

因此,由于这些IP在某种程度上是不确定的,我只是简单地尝试了在路上遇到的每个IP,作为docker容器的xdebug.remot_host。我从xdebug 中选择了以上任何一个故障日志

此外,telnetping:的结果

telnet 172.18.0.1 5902:
telnet: can't connect to remote host (172.18.0.1): Operation timed out
bash-4.4# telnet 172.18.0.4
telnet: can't connect to remote host (172.18.0.4): Connection refused
bash-4.4# ping 172.18.0.1:
5 packets transmitted, 0 packets received, 100% packet loss
bash-4.4# ping 172.18.0.4
PING 172.18.0.4 (172.18.0.4): 56 data bytes
5 packets transmitted, 5 packets received, 0% packet loss

结论:我迷路了。我基本上尝试了所有可能的IP地址。请帮助我了解我需要做什么来调试我的PHP代码。谢谢

如果您在本地机器上,并且有一个docker容器,那么设置xdebug.remote_host=host.docker.internal并将host.docker.internal添加到/etc/hosts就足够了。

我在条目sh脚本中执行此操作:netstat -nr | grep '^0.0.0.0' | awk '{print $2" host.docker.internal"}' >> /etc/hosts

如何检查数据是否已发送:

  1. 您可以启用xdebug.remote_log=/var/log/xdebug_remote_log.log
  2. 我更喜欢监听主机nc -l 5902nc -l 0.0.0.0 5902上的端口。从dockertelnet host.docker.internal 5902通过telnet发送文本并键入内容。您应该在主机上的nc中看到它

如果您的docker位于远程主机上,则必须允许sshGatewayPorts yes侦听0.0.0.0:5904或将流量转发到127.0.0.0:5905。看这里

  1. 在远程主机上运行一次:socat TCP-LISTEN:5904,fork TCP:127.0.0.1:5905
  2. 要在本地计算机上获得响应,请运行:ssh -R 5905:localhost:5904

您可以检查与nctelnet的连接。

TLDR:在docker容器中指定xdebug.remote_connect_back=0xdebug.remote_host=172.17.0.1,它应该可以工作。记住:Xdebug需要从你的Web服务器(Docker内部(连接到你的IDE,监听端口9000。

你没有显示Docker的ifconfig,所以我可能弄错了上面的IP地址。但是,重要的是,您在xdebug.remote_host中指定的IP地址是IDE侦听的地址。并且该IP地址需要可以从Docker访问。您可以通过在Docker容器中运行"telnet IpAddress 9000"来测试这一点,看看您是否获得了主机的正确IP地址。

但还有其他几点:

在你的docker容器上,你的netstat显示:

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9001            0.0.0.0:*               LISTEN 

你有DBGp代理在那里运行吗?你不应该那样做。代理只会让你的情况变得更加复杂。

我在你主机的netstat中看到:

tcp6       0      0 :::9000                 :::*                    LISTEN     

您使用的IDE只侦听IPv6吗?您可能想看看是否可以将其更改为使用IPv4运行。

相关内容

  • 没有找到相关文章

最新更新