DockerとAtomを使ってPHPの開発を始めるまで

#概要

Dockerを用いたPHP開発環境の構築。
デバッグなどの方法も設定。


##やりたかったこと
PHPの開発環境を作って、PHPのコーディング練習を行いたい！
環境構築には、再利用がカンタンなDockerを用いることで、今後も気軽に環境構築できるようにします。

開発には、エディタ「Atom」を用いて、ホストに置いてあるソースを編集し、そのディレクトリをコンテナにマウントすることで、編集を容易にします。

また、開発において、デバッグができないと困るので、
xdebugによるデバッグをできるよう設定しました。

一度に書くには量が多いので、まずはPHPの公式イメージを用いたコンテナの作成と、
PostgreSQLによるデータベースコンテナの作成から。


##使用環境
* Windows10（ホストOS）
* Docker Quickstart Terminal
* Docker 1.12.0
* Docker-compose 1.8.0
* VirtualBox 5.1.0
* Atom（エディタ）

## やったこと

* PHPのイメージを作成
* Postgresqlのイメージを作成
* docker-composerでコンテナを起動
* xdebugの設定（Atom）

# PHPのコンテナイメージを作成
PHPコンテナを作成するために、以下のDockerfileを作成しました。
途中、COPYコマンドでコンテナ内にコピーすることになるphp.iniには、
xdebugの設定等、必要な部分のみを書き込みます。
※php.iniは作成したコンテナ内に用意されていないため、自分で作る必要があるようです。

```Dockerfile:Dockerfile（PHP）
FROM php:5.6-apache

# php.iniをホストからコピー
COPY php.ini /usr/local/etc/php/

# xdebugのインストール
RUN pecl install xdebug

#開放するポートの設定
EXPOSE 80

#実行時のコマンド指定
CMD ["apache2-foreground"]
```

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[xdebug]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=172.17.0.1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
```

php.iniの中で、
**xdebug.remote_host**は仮想ブリッジのIPを設定します。
（参考：[Dockerのネットワークを理解するために覚えたことまとめ](http://christina04.hatenablog.com/entry/2016/07/22/193000)）

また、**zend_extension**は、`RUN pecl install xdebug`時に違うパスになっている場合があるので、
もしうまくいかないときは、php:5.6-apacheのコンテナを起動して、`pecl install xdebug`を実行し、パスを確認。

2ファイルが用意できれば、両ファイルがあるディレクトリで`docker build -t  イメージ名 .`を実行し、イメージを作成。
一応`docker run`で動くかどうか確認する。



#PostgreSQLのコンテナイメージを作成
ここで詰まった。

PostgreSQLサーバは、公式のイメージを使うので、Dockerfileは省略。
データ永続化のため、DBインスタンスが配置される`/var/lib/postgresql/data`をマウントする。
一応動くか確認のため、以下のコマンドを実行したところ...
`docker run -d -p 5432:5432 -v ${パス}/vol:/var/lib/postgresql/data postgres:9.6.2`

...コンテナが起動しない。
`docker ps -a`で確認したところ、コンテナは作成されているようだが、起動しない。

-vオプションを除けば動くが、それでは肝心のデータをホストにマウントできない。

試行錯誤の結果うまくいかなかったため、下記の案で代替することにしました。
（本当はちゃんと外に出したかった。）

1．データボリュームコンテナを作成
`docker run --name postgres-data -v /var/lib/postgresql/data busybox`

2．データボリュームコンテナをpostgreSQLの`/var/lib/postgresql/data`にマウント
（参考：[Docker上のPostgreSQLのデータの永続化の話](http://ishikawa-pro.hatenablog.com/entry/2016/08/13/232833)）


#docker-compose
PHPコンテナと、Postgresqlコンテナをいっぺんに動かしたいので、docker-composeを利用します。
（データベースボリュームコンテナは、他二つのコンテナを消すなどした時も残ってほしいので、別でrunしました。）
`docker run --name postgres-data -v /var/lib/postgresql/data busybox`

まずはdocker-compose.yamlの作成。

```docker-compose.yaml
# Postgresql Server ====================================================

postgresql:
  image: postgres
  environment:
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: docker
  ports:
    - "5432:5432"
  container_name: postgres-db
  volumes_from:
      - postgres-data


# myphp ================================================================

myphp:
  image: myphp
  ports:
    - "80:80"
    - "9000:9000"
  volumes:
    - ${ホスト上のPHPソースを置くパス}:/var/www/html/
  links:
    - postgresql:db
```

**postgresqlコンテナ**の**container_name**は、データボリュームコンテナの名前を入れます。

**myphpコンテナ**は、ソースコードを設置するディレクトリをホストからマウントできるよう、**volimes**を設定しました。
また、**myphpコンテナ**では、80ポートだけでなく、xdebugで用いる9000ポートも開放します。


あとは、`docker-compose.exe up -d`を実行。

#Atomでのxdebugの設定（Path Mapの設定）
さて、xdebugについては、PHPの**Dockerfile**に書き込んだRUNコマンドからインストールを行い、**php.ini**に設定を書き込み、使用する9000ポートも**docker-compose.yaml**でコンテナを立ち上げる時にフォワードするよう設定しました。

デバッグを行うには、まずAtomのパッケージ**php-debug**をインストールする必要があります。
Atomを起動し
　File > Setting > InstallPackages
とたどり、**php-debug**を探してInstall。


インストールが終了したら、xdebugにPath Mapを教えてあげます。

　File > Setting > Packages
を選択し、インストール済みパッケージリストの中から**php-debug**を探します。
見つけたら「Setting」ボタンを押下します。

Path Mapの項目を見つけ出し、以下のように入力します。
`${コンテナのマウントディレクトリパス};${ホストのマウントディレクトリパス}`

これで、Atom画面下の「PHP Debug」ボタンからブレークポイントの作成が可能です。
参考：[php-debug](https://atom.io/packages/php-debug) 一番下にPath Mapの記述があります。