Xdebug 无法连接回 Docker 主机
Xdebug can't connect back to Docker host
我刚刚在我的机器上设置了 Docker 并且 Nginx/PHP7 (FPM)/MySQL 设置一切正常,但是在 [=31= 上安装了 Xdebug ] 容器我无法让它连接回我主机上的 PHPStorm。
这是我的 PHP Xdebug 配置…
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-
20151012/xdebug.so
xdebug.remote_log=/usr/local/var/log/xdebug.log
xdebug.remote_enable=1
xdebug.remote_host=192.168.99.1
xdebug.remote_port=9000
xdebug.remote_connect_back=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
浏览时,如果为容器设置了 Xdebug 启用 cookie,则不会提示连接。如果我浏览一个本地托管的站点,就会有,所以我知道 PHPStorm 的监听是正确的。
在本地机器上,我可以telnet到端口9000…
$ telnet 192.168.99.1 9000
Trying 192.168.99.1...
Connected to 192.168.99.1.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
… 但是我不能从 boot2docker VM 或容器。当我尝试时,它只是坐在那里什么都不做。但是,VM 和容器都可以正常 ping 主机。
我已经尝试禁用我的 Mac 的防火墙,但仍然没有成功。
我不太确定如何在 boot2docker VM 上禁用防火墙。
任何关于为什么这不起作用的见解都将受到欢迎。提前致谢。
您需要使用从您的 Docker 主机桥接到您的 Mac 的网络。在 Mac 上执行 ifconfig
并在其他本地网络上查找本地 IP,例如 10.0.1.13
。 (具体细节可能因 Docker 版本而异,但这适用于 Vagrant 作为 Docker 主机,并且应该适用于大多数虚拟机。)
Xdebug 推荐的容器内配置:
zend_extension = xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.remote_host = docker.for.mac.localhost
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_autostart = 1
xdebug.idekey = PHPSTORM
自 Docker-17.06 起,您可以通过静态主机名 docker.for.mac.localhost
访问 Container 中托管在 Mac 上的服务
I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST ?
The Mac has a changing IP address (or none if you have no network access). From 17.06 onwards our recommendation is to connect to the special Mac-only DNS name docker.for.mac.localhost which resolves to the internal IP address used by the host.
见https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers
我通过将 client_port 更改为 9000 以外的其他内容来解决这个问题,因为我的 Mac 已经在端口 9000 上侦听 php-fpm。
我用它来查看列出了哪些端口以及列出了什么:
sudo lsof -nP -iTCP -sTCP:LISTEN
这就是我在 php.ini 容器内的 Xdebug 所需的全部内容:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9009
然后在PHP设置中Debug页面Xdebug部分的PHPStorm中设置Debug port也为 9009
这对我有用:
xdebug.idekey="VSCODE"
xdebug.default_enable=1
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/var/www/html"
xdebug.remote_connect_back=0
enter code here
xdebug.cli_color=1
xdebug.var_display_max_depth=10
xdebug.remote_host=“host.docker.internal”
我还必须 删除 这些与 xdebug 相关的环境变量 docker-compose :
XDEBUG_CONFIG: "remote_host=localhost"
PHP_IDE_CONFIG: "服务器名=Docker"
来自我的 docker-compose。
这是 docker compose:
的旧设置
如有任何问题,请告诉我:)
花了一些时间尝试解决后,我找到了解决方案。这个对我有用。
您必须在 launch.json
文件中添加 pathMappings。像这样:
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html/": "${workspaceFolder}"
}
},
]
}
我刚刚在我的机器上设置了 Docker 并且 Nginx/PHP7 (FPM)/MySQL 设置一切正常,但是在 [=31= 上安装了 Xdebug ] 容器我无法让它连接回我主机上的 PHPStorm。
这是我的 PHP Xdebug 配置…
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-
20151012/xdebug.so
xdebug.remote_log=/usr/local/var/log/xdebug.log
xdebug.remote_enable=1
xdebug.remote_host=192.168.99.1
xdebug.remote_port=9000
xdebug.remote_connect_back=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
浏览时,如果为容器设置了 Xdebug 启用 cookie,则不会提示连接。如果我浏览一个本地托管的站点,就会有,所以我知道 PHPStorm 的监听是正确的。
在本地机器上,我可以telnet到端口9000…
$ telnet 192.168.99.1 9000
Trying 192.168.99.1...
Connected to 192.168.99.1.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
… 但是我不能从 boot2docker VM 或容器。当我尝试时,它只是坐在那里什么都不做。但是,VM 和容器都可以正常 ping 主机。
我已经尝试禁用我的 Mac 的防火墙,但仍然没有成功。
我不太确定如何在 boot2docker VM 上禁用防火墙。
任何关于为什么这不起作用的见解都将受到欢迎。提前致谢。
您需要使用从您的 Docker 主机桥接到您的 Mac 的网络。在 Mac 上执行 ifconfig
并在其他本地网络上查找本地 IP,例如 10.0.1.13
。 (具体细节可能因 Docker 版本而异,但这适用于 Vagrant 作为 Docker 主机,并且应该适用于大多数虚拟机。)
Xdebug 推荐的容器内配置:
zend_extension = xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.remote_host = docker.for.mac.localhost
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_autostart = 1
xdebug.idekey = PHPSTORM
自 Docker-17.06 起,您可以通过静态主机名 docker.for.mac.localhost
I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST ?
The Mac has a changing IP address (or none if you have no network access). From 17.06 onwards our recommendation is to connect to the special Mac-only DNS name docker.for.mac.localhost which resolves to the internal IP address used by the host.
见https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers
我通过将 client_port 更改为 9000 以外的其他内容来解决这个问题,因为我的 Mac 已经在端口 9000 上侦听 php-fpm。
我用它来查看列出了哪些端口以及列出了什么:
sudo lsof -nP -iTCP -sTCP:LISTEN
这就是我在 php.ini 容器内的 Xdebug 所需的全部内容:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9009
然后在PHP设置中Debug页面Xdebug部分的PHPStorm中设置Debug port也为 9009
这对我有用:
xdebug.idekey="VSCODE"
xdebug.default_enable=1
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/var/www/html"
xdebug.remote_connect_back=0enter code here
xdebug.cli_color=1
xdebug.var_display_max_depth=10
xdebug.remote_host=“host.docker.internal”
我还必须 删除 这些与 xdebug 相关的环境变量 docker-compose :
XDEBUG_CONFIG: "remote_host=localhost"
PHP_IDE_CONFIG: "服务器名=Docker"
来自我的 docker-compose。
这是 docker compose:
如有任何问题,请告诉我:)
花了一些时间尝试解决后,我找到了解决方案。这个对我有用。
您必须在 launch.json
文件中添加 pathMappings。像这样:
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html/": "${workspaceFolder}"
}
},
]
}