vagrant up 一発で立ち上がるウェブアプリケーション開発環境作り　第四回：アプリケーションサーバー編

VagrantとDocker（とDocker Compose）を使って開発環境を一発で立ち上げられるようすることを目標とした連載、第四回です。
[第一回：Vagrant編](http://qiita.com/marrontan619/items/01cf11fa74af5bbdd96b)
[第二回：Docker編](http://qiita.com/marrontan619/items/6ed07ad391884bfa1a22)
[第三回：プロキシサーバー編](http://qiita.com/marrontan619/items/1974753500a7e6956318)

第二回で記事にしたdocker-compose.ymlのこの部分について、詳しく見ていきます

```yaml: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を使用してイメージをビルドするようになっています。

```dockerfile: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"というディレクトリ）

```php:index.php
<? phpinfo(); ?>
<!DOCTYPE html>
<html>
  <?php
    $i = 1;
    $i = 2;
  ?>
  <h1><?php echo $i; ?></h1>
</html>
```

ブレークポイントで止まるのがよく見えるように、phpinfoとちょっとした計算をやらせています。

### プロキシの設定をする

PHPが動く環境はできましたが、このままではホスト（Windows）から接続できません。
第三回で作成したプロキシサーバーから、appサーバーへプロキシの設定をします。
*.conf（名前は任意）ファイルを以下の用にして、/etc/nginx/conf.d/で読み込むようにします。（第三回参照）

```nginx:httpd.conf
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です。
確認方法は[第三回](http://qiita.com/marrontan619/items/1974753500a7e6956318)参照

次に、Eclipseのリモートデバッグの設定をします。
Window > 設定 > PHP > デバッグ > デバッガー > XDebugの構成を開き、「リモート・セッション受信(JIT)」を「ローカル・ホスト」に設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/48832/67df21bc-0d38-75fd-ce72-3c0f070a6b6e.png)


設定が終わったら再度、ブラウザで http://192.168.33.10 にアクセスすると、ブレークポイントで止まることが確認できるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/48832/ee115099-1df8-2196-d903-f1246a946592.png)

## 結び

PHP + Eclipseで進めてきましたが、今回の主目的はコンテナで動作しているアプリをリモートデバッグすることです。
リモートデバッグの設定方法自体は情報がたくさんあると思うので、各言語・IDEで読み替えてみてください。

次回、[DBサーバー編](http://qiita.com/marrontan619/items/c9ee38a5ed5c59f6696a#_reference-5517010e3cf6acfecd1d)に続く。