#概要
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は作成したコンテナ内に用意されていないため、自分で作る必要があるようです。
FROM php:5.6-apache
# php.iniをホストからコピー
COPY php.ini /usr/local/etc/php/
# xdebugのインストール
RUN pecl install xdebug
#開放するポートの設定
EXPOSE 80
#実行時のコマンド指定
CMD ["apache2-foreground"]
[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のネットワークを理解するために覚えたことまとめ)
また、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のデータの永続化の話)
#docker-compose
PHPコンテナと、Postgresqlコンテナをいっぺんに動かしたいので、docker-composeを利用します。
(データベースボリュームコンテナは、他二つのコンテナを消すなどした時も残ってほしいので、別でrunしました。)
docker run --name postgres-data -v /var/lib/postgresql/data busybox
まずは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 一番下にPath Mapの記述があります。