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.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.