Docker for Mac の PHPStorm で Xdebug を行う


環境が変わるたびに Xdebug の設定にハマってブログに書いている いしかわ です。
今回も開発環境が Docker に変わり、案の定ハマったので足跡を残しておきます(苦笑

それと、弊社ではめずらしい求人が出ていることがありますので、どうぞ見てみてください。
>> 採用情報はコチラ

■ 構成
OS X Yosemite
Docker for Max
 Docker version 1.12.5
Webサーバーコンテナ
 CentOS 6.8
 PHP 5.3.3
 Xdebug 2.1.4
DBサーバーコンテナ
 MySQL

最初、よくわからなかったのがネットワーク構成。おそらく以下のような感じのはず?
MacはWifiにて 192.168.0.x を利用。ただ、ネットワークを移動すると 192.168.3.x や 192.168.11.x なども利用しています。
screen-shot-2017-01-08-at-14-49-41

Docker for Mac を入れると、Mac の eth0 に対して 172.17.0.1 が割り当てられます。
Docker内の各コンテナには ランダムに空いているIPが割り当てられます。Webコンテナは 172.17.0.2、DBコンテナに 172.17.0.3 が振られていました。
Docker 内は bridge ネットワークとなっており、コンテナ起動時にコンテナ内に直接書き込まれるようです。

■ Xdebug の設定
CentOS 6.8、PHP5.3.3 の環境にて、Xdebug 自体は入っており /etc/php.d/xdebug.ini が確認できました。
xdebug.ini を以下のように書き換えます。Dockerfile の COPY なり RUN echo なりご自由な感じで。

zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart= 1
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

Apache が立ち上がるように、Dockerfileの末尾は以下としています。

EXPOSE 80
ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]

以下にてコンテナを起動。

docker run -d -p 80:80 image_name

※ -p 9000:9000 などは必要なし。Xdebug の 9000 は、Webサーバー側からMac側への通信のため。

http://localhost/info.php なり何なりで、phpinfo() の中身を確認。Xdebug が確認できればOK。
screen-shot-2017-01-08-at-14-02-08

■ PHPStorm でデバッグ実行
PHPStorm を適切に設定する。
Run/Debug Configrations は PHP Remote Debug にて。
DBGp Proxy は設定せず。
Servers では Use path mappings で 手元のファイルと位置を合わせる。
Deployment では Connection の Type を Local or mounted folder に。Mappings でも位置を合わせる。
で、デバッグを実行。いつもなら引っかかるはずなのだが・・・、引っかからず。

んー、なんでだろう、アレコレ探しているとわかったことが。
どうも、xdebug.remote_connect_back は$_SERVER[‘HTTP_X_FORWARDED_FOR’] か $_SERVER[‘REMOTE_ADDR’] の値に対してポート9000で通信するようです。
説明の詳細はここのGif画像でも確認できます。 https://xdebug.org/docs/remote

実際に、PHP内で下記のように確認してみると、Dockerの内部ネットワークIPが表示された。

echo $_SERVER['HTTP_X_FORWARDED_FOR']; // 空
echo $_SERVER['REMOTE_ADDR']; // 172.17.0.1

んー、もしかすると内部ネットワークIPを指してしまうので、IDEで拾えないのかもしれないですね。
で、以下のように Xdebug の設定を変えてみました。

xdebug.remote_connect_back = 0
xdebug.remote_host = 192.168.0.10

すると、IDE でデバッグが引っかかりました。

しかし課題が。私の環境ではオフィスによってWifiのIPが変わるため、切替のたびに xdebug.remote_host を変えたくないのです。

■ Mac の en0 に複数のIPを割り当てる
いろいろ調べていたところ、Macでは1つのNICに複数のIPを振れるようです。

sudo ifconfig en0 alias 10.254.254.254

これで ifconfig してみると en0 に2つのIPが振られていました。

次に、PHPStorm で設定します。なぜこのような設定なのかは分からなかったのですが、おそらくIDE側からXdebugに対して10.254.254.254:9000 に対して通信してくれと連絡するような設定なのでしょうか。
screen-shot-2017-01-08-at-16-22-55

xdebug.ini についても以下のように設定します。

xdebug.remote_connect_back = 0
xdebug.remote_host = 10.254.254.254

試してみると、デバッグに成功しました。

しかし、また課題が。
今度はMacを再起動すると en0 に設定した alias が消えているではありませんか。

■ en0 の alias を消えないように
ifconfig en0 alias の設定が再起動しても消えないように、調べてみると Apple の公式の回答がありました。
GUIの System Preferences > Network で en0 を選択し、 Duplicate Service を選択し設定すると再起動しても消えないとのこと。
実際に試してみると、再起動しても設定は消えず問題は解決しました。
screen-shot-2017-01-08-at-16-31-50

うむ、これにて一件落着。

The following two tabs change content below.

いしかわ

まだまだ広く浅く勉強中のエンジニア。得意分野はラーメン。

Comments are closed.