xdebug не работает в Docker для Mac

после того, как я переключился с Docker Machine на Docker для Mac xdebug перестала работать. Порт 9000 на хосте недоступен из контейнера с xdebug.
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. :-(

как решить мою проблему ?

3 ответов


У меня такая же проблема. Это может быть связано с ограничениями docker в OSX. Смотрите эти ссылки.

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), которое возвращается к вам localhost. Когда вы затем используете этот ip как вместо адреса удаленного хоста, назначенного docker (либо 127.0.0.1, либо 172.17.0.2), он должен сделать трюк. Следуйте за этой ссылке для кодированного решения


измените docker-compose.yml к ниже.

вы захотите открыть порт 9000, а не привязывать. Также обновите свой xdebug ini до ip вашего хоста (mac), а не ip docker.

Я также добавил, Как вы можете подключить файл xdebug с вашего mac непосредственно к докеру, чтобы вы могли обновить его на лету. Это позволяет вам больше контроля, так как вам может потребоваться обновить свой ip-адрес на основе перехода от wifi к wifi. Свойство xdebug.remote_host= ip должен быть вашим ip локальной сети mac. Просто помните, если вы на 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 Особенно в подрубрике:

Я ХОЧУ ПОДКЛЮЧИТЬСЯ ИЗ КОНТЕЙНЕРА К СЛУЖБЕ НА ХОСТЕ

хост имеет изменяющийся IP-адрес (или нет, если у вас нет сети доступ.) С 18.03 и далее наша рекомендация-подключиться к специальное DNS имя хоста.докер.внутренний, который разрешает к внутреннему IP-адрес, используемый хозяином. Это для целей развития и не работает в производственной среде за пределами Docker для Mac.

как только вы поймете это, вы можете установить remote_host параметр host.docker.internal в вашем php.ini внутри контейнера. Также не забудьте установить 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