Xdebug с туннелем SSH в Docker для Mac
Недавно я читал много сообщений от сообщества Docker о том, как отлаживать PHP-приложение в PHPStorm с помощью Docker для Mac. Все они содержат кусочки полезной информации, но не видели рабочего решения в одном месте.
2 ответа
Вот что сработало для меня.
Контейнер внутри докера
Изменить конфигурацию xdebug
# automatically start debugger on every request
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
# send all debug requests to 127.0.0.1, remote_connect_back should be turned off
xdebug.remote_connect_back = 0
xdebug.remote_host=127.0.0.1
#log all xdebug requests to see is it working correctly
xdebug.remote_log=/var/log/remote.log
Убедитесь, что xdebug работает
На этом этапе попробуйте запустить приложение PHP. Журнал должен содержать такие записи для каждого запроса:
I: Connecting to configured address/port: 127.0.0.1:9000
I: Connected to client. :-)
Если вы видите что-то подобное в журнале, remote_host или remote_connect_back настроены неправильно.
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.
W: Creating socket for '172.18.0.1:9000', poll: Operation now in progress.
E: Could not connect to client. :-(
Я видел ситуации, когда Xdebug работал в CLI, но не из браузера, когда эта проблема появлялась в журнале, remote_connect_back=0 исправлял ее.
конфигурация sshd
Чтобы разрешить ssh-туннелирование в контейнер: отредактируйте /etc/ssh/sshd_conf и добавьте:
GatewayPorts yes
При необходимости перезапустите sshd (в идеале это должно быть частью Dockerfile).
На хост-машине
Запустить обратный туннель SSH
Запустите эту команду и держите ее открытой на отдельной вкладке "Терминал":ssh -p {container_22_port} -R 9000:localhost:1111 root@127.0.0.1
где {container_22_port} - это порт на хост-компьютере, сопоставленный с портом exdposed 22 на док-контейнере. 9000 - это порт, используемый Xdebug внутри контейнера, порт 1111, который будет использоваться хост-машиной для прослушивания соединений Xdebug.
Тест с netcat
На этом этапе вы можете убедиться, что Xdebug фактически передает информацию из контейнера Docker на хост-компьютер. Запустите netcat, чтобы увидеть, что отправлено на порт 1111, и запустите приложение php:
nc -l 1111
Вы должны увидеть что-то вроде этого:
<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///var/www/magento2/index.php" language="PHP" xdebug:language_version="7.0.12" protocol_version="1.0" appid="1006" idekey="XDEBUG_ECLIPSE"><engine version="2.5.0rc1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2016 by Derick Rethans]]></copyright></init>
Настроить PhpStorm
Opne File
->DefaultSettings
и там в Languages&Frameworks
->PHP
->Debug
менять Xdebug
->Debug port
в 1111
(тот, который мы использовали, чтобы открыть туннель SSH). На этом этапе PhpStorm должен начать принимать соединения от xdebug.
Есть ли проблемы с этим подходом?
Использовать xdebug.remote_host=host.docker.internal
работает везде.
Я обнаружил, что вам не нужен SSH-туннель, чтобы заставить его работать.
Xdebug нужно только подключиться к работающему отладчику IDE, но могут быть уже использованы порты по умолчанию, такие как порт для FPM (9000).
Внутри контейнера
Установите параметры xdebug следующим образом:
xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1
Примечание: если вы используете контейнер nginx-proxy в качестве обратного прокси, установите remote_host
как тот, который вы определили в VIRTUAL_HOST
Использование PhpStorm
- Файл -> Настройки
- Языки и рамки
- PHP
- Серверы: добавьте один и установите хост как localhost: 80 с выбранным Xdebug с отображением пути... сопоставьте папку ВНУТРИ Docker (/var/www/) с одной
- Отладка: установите порт Xdebug на 10000 с установленным флажком Может принимать внешние подключения
- PHP
- Языки и рамки