Edited at

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

More than 1 year has passed since last update.


概要

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(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のネットワークを理解するために覚えたことまとめ

また、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の作成。


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の記述があります。