VagrantとDocker(とDocker Compose)を使って開発環境を一発で立ち上げられるようすることを目標とした連載、第四回です。
第一回:Vagrant編
第二回:Docker編
第三回:プロキシサーバー編
第二回で記事にしたdocker-compose.ymlのこの部分について、詳しく見ていきます
version: "2"
services:
# mysql
mysql:
# php
app:
build: app/
volumes:
- /vagrant/docker/app/volume/web-root:/var/www/html:rw
environment:
XDEBUG_CONFIG: remote_host=10.0.2.2
#links: # 今回は関係無し
# - mysql:mysql
# reverse-proxy
proxy:
image: nginx:latest
volumes:
- /vagrant/docker/proxy/volume/conf:/etc/nginx/conf.d:rw
- /vagrant/docker/proxy/volume/log:/var/log/nginx:rw
ports:
- "80:80"
- "443:443"
links: # 追加
- app:app # 追加
今回使用する部分のディレクトリ構成はこうです。
<vagrant-root>
├── docker
│ ├── docker-compose.yml
│ ├── app # アプリコンテナ関連
│ │ ├── Dockerfile
│ │ └── volume
│ │ └── web-root
│ │ └── index.php
│ └── proxy # Webサーバーコンテナ関連
│ └── volume
│ ├── conf
│ │ └── httpd.conf
│ └── log
│ ├── access.log
│ └── error.log
├── package.box
├── provision.sh #第一回参照
└── Vagrantfile
PHPが実行できるコンテナを用意する
Docker Hubで配布されているphp-fpmのイメージを使用します。
build: app/の設定で、docker-compose.ymlから相対パスでapp/にあるDockerfileを使用してイメージをビルドするようになっています。
FROM php:7.0-fpm
MAINTAINER marrontan619
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/xdebug.ini
php:7.0-fpmのイメージを使って、イメージをビルドする際に、xdebugをpeclを使ってインストールしています。
document rootは/var/www/html/になっているので、そこにホスト側で作成したPHPファイルが置かれるように、volumes:でマウントします。(ホスト側では"web-root"というディレクトリ)
<? phpinfo(); ?>
<!DOCTYPE html>
<html>
<?php
$i = 1;
$i = 2;
?>
<h1><?php echo $i; ?></h1>
</html>
ブレークポイントで止まるのがよく見えるように、phpinfoとちょっとした計算をやらせています。
プロキシの設定をする
PHPが動く環境はできましたが、このままではホスト(Windows)から接続できません。
第三回で作成したプロキシサーバーから、appサーバーへプロキシの設定をします。
*.conf(名前は任意)ファイルを以下の用にして、/etc/nginx/conf.d/で読み込むようにします。(第三回参照)
server {
listen *:80;
server_name 192.168.33.10;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
root /var/www/html;
index index.php index.html index.htm;
charset utf-8;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /volume/web-root;
}
location ~ /\.ht {
deny all;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
ほとんど他の方々のサンプルから拝借したものですが、ポイントは
fastcgi_pass app:9000;
ここです。
docker-compose.ymlのproxyのlinks:で、"app"というホスト名で、appサーバーを参照できるようになっています。
デバッグ環境を作る
まずはphpinfoを表示してみる
docker-compose up -d --buildと実行したら、ホスト(Windows)のブラウザから、
http://192.168.33.10
にアクセスすると、phpinfoが表示されていることを確認できるはずです。
ブレークポイントで止まるように設定する
WindowsのEclipseからリモートデバッグできるように設定をします。本記事のDockerfileを使っていれば、Xdebugがインストールされているはずなので、リモートホストの設定をします。
docker-compose.yml内のappコンテナの環境変数、XDEBUG_CONFIGで、リモートホストのIPを指定します。
このときのIPは、Vagrantから見たホスト(Windows)でOKです。
確認方法は第三回参照
次に、Eclipseのリモートデバッグの設定をします。
Window > 設定 > PHP > デバッグ > デバッガー > XDebugの構成を開き、「リモート・セッション受信(JIT)」を「ローカル・ホスト」に設定します。
設定が終わったら再度、ブラウザで http://192.168.33.10 にアクセスすると、ブレークポイントで止まることが確認できるはずです。
結び
PHP + Eclipseで進めてきましたが、今回の主目的はコンテナで動作しているアプリをリモートデバッグすることです。
リモートデバッグの設定方法自体は情報がたくさんあると思うので、各言語・IDEで読み替えてみてください。
次回、DBサーバー編に続く。