xdebug 在 Mac 的 Docker 桌面中不工作

xdebug not working in Docker Desktop for Mac

在我从 Docker Machine 切换到 Docker 桌面后 Mac, xdebug 已经停止工作。使用 xdebug 无法从容器访问主机上的端口 9000
php.ini:

xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_host=172.18.0.1
xdebug.idekey=PHPSTORM

docker-compose.yml:

version: '2'
services:
  php:
    image: <image name>
    ports:
      - 80:80
    # - 9000:9000
    volumes:
      - .:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/php.ini

xdebug.log:

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:9000.
E: Could not connect to client. :-(

如何解决我的问题?

我也遇到了同样的问题。可能与OSX内docker的限制有关。请参阅这些链接。

https://docs.docker.com/docker-for-mac/networking/ https://forums.docker.com/t/explain-networking-known-limitations-explain-host/15205

还建议了可能的解决方法。其中之一是创建一个具有新 ip(例如 10.254.254.254)的设备,该设备循环回本地主机。当您使用此 ip 作为远程主机地址而不是 docker 分配的地址(127.0.0.1 或 172.17.0.2)时,它应该可以解决问题。按照 this link 获取编码解决方案

将您的 docker-compose.yml 更改为以下内容。

您需要公开端口 9000,而不是绑定。还要将您的 xdebug ini 更新为主机 (mac) 的 ip,而不是 docker 的 ip。

我还添加了如何将 xdebug 文件从 mac 直接挂载到 docker,以便您可以即时更新它。这使您可以更好地控制,因为您可能必须根据从 wifi 移动到 wifi 来更新您的 ip。 xdebug.remote_host= ip 应该是你的 mac 本地网络 ip。请记住,如果您在 apache 上执行 service apache2 restart 或适当的命令以在您更改 ip 时重新启动服务器。

version: '2'
services:
  php:
    image: <image name>
    ports:
      - 80:80
    expose:
      - "9000"
    volumes:
      - .:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/php.inivolumes:
      - ./20-xdebug.ini:/etc/php/7.1/cli/conf.d/20-xdebug.ini //obviously you would change this to your correct paths
      - ./20-xdebug.ini:/etc/php/7.1/apache2/conf.d/20-xdebug.ini //obviously you would change this to your correct paths


# 20-xdebug.ini, this is how mine is setup. 
zend_extension = /usr/lib/php/20160303/xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=192.168.0.4 // Make sure you use your host (mac) local ip, not the ip of docker. 
xdebug.remote_port=9000
xdebug.idekey = PHPSTORM
xdebug.remote_handler = dbgp
xdebug.remote_autostart = 1
xdebug.remote_log = /var/log/xdebug.log

我为此苦苦挣扎了一段时间,在阅读 https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support 上的官方文档后,我找到了一个更简单的解决方案 特别是这部分:

I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST

The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker for Mac.

理解了这一点后,您可以在容器内的 php.ini 中将 remote_host 设置设置为 host.docker.internal。也不要忘记将 xdebug.remote_connect_back 设置为 0,主机设置不会被忽略:

xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
xdebug.remote_log=/tmp/xdebug.log
xdebug.remote_host=host.docker.internal
xdebug.remote_enable=1
xdebug.remote_connect_back=0

我使用了这个设置并且有效:)

xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
xdebug.remote_host=host.docker.internal
xdebug.remote_enable=1
xdebug.remote_connect_back=0

与 launch.json 在 vscode

 "name": "Listen 9000",
 "type": "php",
 "request": "launch",
 "log": true,
 "externalConsole": false,
 "pathMappings": {
        "/var/www/html": "/Users/folder/project/src"
     },
  "port": 9000,

与docker-compose.yml: