Docker上のPHPアプリを「XDebug」と「PhpStorm」を利用してリモートデバッグしてみます。なお、Dockerコンテナは「Laradock」を利用して立ち上げています。
LaradockでXDebugを有効化
laradock/.env の設定を以下のようにします。
WORKSPACE_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_XDEBUG=true
DOCKER_HOST_IP=192.168.11.10laradock/.env は、laradock/docker-compose.yml にて利用されます。
DOCKER_HOST_IP は、Dockerコンテナから見える ローカルマシンのIPアドレス です。ホストマシン上で ifconfig などで確認して設定します。
XDebugの設定調整(不備あり)
laradock/workspace/xdebug.inilaradock/php-fpm/xdebug.ini
上記ファイルの設定を以下のようにします。
(注意:後述しますが、下記設定には不備があります。)
- xdebug.remote_autostart=0
+ xdebug.remote_autostart=1
- xdebug.remote_enable=0
+ xdebug.remote_enable=1
- xdebug.remote_connect_back=0
+ xdebug.remote_connect_back=1
- xdebug.cli_color=0
+ xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=dockerhost
xdebug.idekey=PHPSTORM参考)
http://laradock.io/#edit-xdebug-ini-files
imageの作り直し
docker imageを作り直します。
docker-compose up --build -d php-fpm
docker-compose.yml の depends_on にて、workspace が指定されているため、workspace も作り直されました。

nginxとmysqlも立ちあげときます。

PhpStormの設定調整
ここでは、以下のように設定しておきます。


デバッグ接続をリッスン状態にします。
(start Listening for PHP Debug Connections)

以下コマンドで、9000ポート でリッスン状態となっていることが確認できます。

これで、以下のようにリモートデバッグを行えるようにしたつもりです。
1. コンテナにリクエストが到達すると、
2. コンテナ上のXdebugが、ホストマシン(今回は192.168.11.10)の
9000ポートに対してDBGPの接続通信を行う。
3. DBGPの接続が確立してデバッグが行える。しかし、PhpStorm上でデバッグが開始されませんでした。原因を調べてみます。
XDebugのlogを確認
xdebug_log を出力するようにして、不具合の原因を確認します。
イメージを作り直すのが手間だったので、直接コンテナを修正します。
docker-compose exec php-fpm bashコンテナ内に vim がインストールされてなかったのでインストールします。
apt-get update
apt-get install vimxdebug.ini を編集します。
vi /usr/local/etc/php/conf.d/xdebug.iniXDebugのログが /tmp/xdebug_log に出力されるように、下記内容を追記します。
xdebug.remote_log="/tmp/xdebug_log"設定反映させるため、コンテナの停止・稼働を行います。
docker container stop laradock_php-fpm_1
docker container start laradock_php-fpm_1
コンテナにHTTPリクエスト実施後、ログを確認してみます。
下記コマンドで確認できます。
docker-compose exec php-fpm cat /tmp/xdebug_log
原因は「remote_connect_back」
ログをみてみたところ、192.168.11.10:9000 に接続するよう設定したつもりが、172.21.0.1:9000 に接続しています。
Nginx側で、dockerのGatewayからリクエストが来ているように見えているようです。
Gatewayは、下記のように確認できます。

この場合、下記設定を修正する必要があります。
xdebug.remote_connect_back=1xdebug.remote_connect_back を有効にすると、$_SERVER['REMOTE_ADDR'] に対してDBGP接続通信を行うように試みるようです。
今回のケースでは、xdebug.remote_host で指定したIPに接続してもらいたいので、xdebug.remote_connect_back を無効にします。
XDebugの設定調整(再修正)
laradock/workspace/xdebug.inilaradock/php-fpm/xdebug.ini
を以下のようにします。
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_connect_back=0
xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=dockerhost
xdebug.idekey=PHPSTORM修正後、イメージを作り直して動作確認したところ、無事リモートデバッグができるようになりました。
