DOCKER内のリモートサーバーにXDEBUG3を設定してUBUNTUクライアントのPHPSTORMでデバッグする

この記事はブログとプログラミングで生計をたてている海外在住ウェブディベロッパーがわかりやすさにこだわって作成しました

[Ubuntu] docker内のxdebug.remote_hostを自動で設定するには
Docker for Macの場合Dockerコンテナ内からDockerホストは、host.docker.internalで参照できます。15-xdebug.iniのxdebug.remote_hostには、次のように書きます。xdebug

残念ながら、host.docker.internal では、Dockerホストを参照できませんでした。

手動で設定する方法

ipコマンドでローカルPCのIPアドレスを調べます。仮に192.168.11.4 とします。

$ ip a
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.4/24 brd 192.168.11.255 scope global dynamic noprefixroute enp3s0
Code language: Bash (bash)

php-pecl-xdebugのインストール直後の15-xdebug.iniをDockerコンテナから取り出しておきます。xdebug.remote_hostの箇所を編集します。その他のxdebug項目も編集しておきます。

;編集前
;xdebug.remote_host = localhost

;編集後
xdebug.remote_host = "192.168.11.4"
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.idekey = my_project_idekeyCode language: plaintext (plaintext)

Dockerfileのどこか終わり付近で、編集済みの15-xdebug.iniをDockerコンテナにコピーします。

COPY 15-xdebug.ini  /etc/php.d/

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]Code language: Dockerfile (dockerfile)

git cloneした直後に1回だけやればいいんだけど...

IPアドレスを書いてしまったから、15-xdebug.iniをgit commitできないし

この手順をwikiに書くのも面倒だし、

めったにやらないから、すぐに忘れてしまって、wikiを検索するのも面倒ね

実験

調べると、Dockerコンテナ内で、DockerホストのIPアドレスを調べるには、ipコマンドとawkコマンドを使って、

[root@869574d22dc0 /]# ip route
default via 192.168.192.1 dev eth0 
192.168.192.0/20 dev eth0 proto kernel scope link src 192.168.192.3 

[root@869574d22dc0 /]# ip route | awk 'NR==1 {print $3}'
192.168.192.1Code language: Bash (bash)

この「192.168.192.1」と「host.docker.internal」を /etc/hosts に追加します。

[root@869574d22dc0 /]# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
192.168.192.3	869574d22dc0
192.168.192.1 host.docker.internal

Code language: Bash (bash)

Dockerコンテナ内の/etc/php.d/15-xdebug.ini を編集します。

xdebug.remote_host = host.docker.internalCode language: plaintext (plaintext)

httpdを再起動します。

[root@869574d22dc0 /]# /usr/sbin/httpd -k restartCode language: plaintext (plaintext)

Dockerホスト側のPhpStormで、ブレークポイントで止まりました!

DockerホストのIPアドレスを調べて、host.docker.internal として、/etc/hosts に登録する、これを自動で設定したいわけです。

自動で設定する方法

「DockerホストのIPアドレスを調べて、host.docker.internal として、/etc/hosts に登録する」処理は、Dockerfileに記述できません。

Dockerコンテナを起動するたびに、Dockerコンテナのネットワークアドレスが変わるからです。

Dockerコンテナを起動するとき、これまでのCMD処理は

  • Webサーバを起動する

だけでしたが、

  • DockerホストのIPアドレスを調べて、host.docker.internal として、/etc/hosts に登録する
  • Webサーバを起動する

ようにします。

Dockerfile

Dockerfileを次のように変更します。

# 修正前
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]Code language: Dockerfile (dockerfile)
# 修正後
RUN yum install -y iproute  # ipコマンドのインストール。Dockerfileのどこに挿入してもかまいません

COPY init.sh /root/init.sh
CMD "/root/init.sh"Code language: Dockerfile (dockerfile)

init.sh

次に、init.shを作ります。これまでDockerfileCMDで実行していた内容に合わせて、置き換えてください。

#!/bin/sh -ue

# /etc/hostsにDockerホストのIPアドレスを登録する
echo $(ip route | awk 'NR==1 {print $3}') host.docker.internal >>/etc/hosts

# Webサーバの起動
/usr/sbin/httpd -D FOREGROUNDCode language: PHP (php)

Dockerイメージをビルドして、起動します。

$ sudo docker-compose build
$ sudo docker-compose up -d
$ sudo docker-compose psCode language: Bash (bash)

Dockerコンテナにbashでログインします。

docker-compose.ymlで、container_name: php72.hoge.dockerと設定しているなら、

$ sudo docker exec -it php72.hoge.docker bash
[root@869574d22dc0 /]#Code language: Bash (bash)

/etc/hostsを表示してみると、

[root@869574d22dc0 /]# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
192.168.192.3	869574d22dc0
192.168.192.1 host.docker.internal

Code language: Bash (bash)

無事、最後の行に「192.168.192.1 host.docker.internal」が追加されました。このdockerコンテナ内から、host.docker.internal で、起動元のPCが見えるようになりました。

15-xdebug.ini

これで、15-xdebug.inixdebug.remote_hostの箇所は、IPアドレスではなく、host.docker.internal と書くことができます。

xdebug.remote_host = host.docker.internal
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.idekey = my_project_idekey
PHP/Javascript/WORDPRESS案件全般承ります

オーストラリアで主に日系企業や個人のお客様からのご依頼でお仕事をしております。この記事についてのご質問またはお困りのことがございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました