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}"
            }
        },
    ]
}