【Xdebug】リモートサーバに構築したコンテナにMacから接続する方法【Docker】
リモートサーバ上のLinux環境の上でPHPコンテナをDockerで立ち上げ、Xdebugを使いVisual Studio Codeからリモートデバッグを行う方法について設定に詰まりました。
結論としては、Linux環境ではXdebugの設定に利用するhost.docker.internal
が使えないため、VSCodeの設定が必要でした。
環境によるXdebugの設定の違い
ブレークポイントでとまらない原因と対策
ローカルマシン(Mac)上では同じような設定で接続できるのに、開発用にLinuxをリモートサーバとしてVScodeで接続したところ、Xdebugがブレークポイントで止まらずに解決するまでに少々時間がかかりました。設定周りを調べていてそもそもLinuxでDockerコンテナを立ち上げる場合とMac/WindowsでDockerコンテナを立ち上げる場合の違いがありました。
どうやらLinux環境でDockerを使用する場合、host.docker.internal
がデフォルトで利用できないようです。設定を追加することもできるようですが、Linuxの場合はDockerを立ち上げるホストマシンのIPを指定することがよさそうです。
Docker環境でも、Mac/WindowsとLinuxでは設定が違う
MacやWindowsのDockerではDockerはLinuxカーネルを必要としています。つまりDocker (Desktop)がこの仮想化レイヤーを管理し、ホストとコンテナ間の通信をしているため、host.docker.internal
が立ち上がっています。
反面、Linux環境ではホストがLinuxなのでMacやWindowsほどの仮想化レイヤーがいらない。従ってDNS解決のためのいらないわけです。なるほど確かに。調べてみるとその通りですがhost.docker.internal
の設定はもはや一つの記号として見ていたので、調べるまで全然意識していませんでした。
OS | client_host の設定方法 | 理由 |
---|---|---|
Mac/Windows | host.docker.internal | Docker Desktop が仮想ネットワークブリッジを提供 |
Linux | ホストマシンの実 IP を指定 | Docker がホストと独立したネットワークを使うため |
というわけで、PHPコンテナに組み込むXdebug.iniの設定は以下のようになります。
Xdebugの設定(Linux)
|
|
Xdebugの設定(Mac/Windows)
|
|
VScodeのlaunch.jsonの設定
|
|