DockerfileでPHP7環境構築
今回、Docker HubにあるPHP公式リポジトリのCreate a Dockerfile in your PHP projectの部分を参考にしました。
環境
mac OS Sierra上にDocker for macでPHP7 + apacheの環境を構築していきます。今はnginxが主流となりつつありますが、トラブルシューティングしやすいように、今回は慣れているapacheを使います。
- Docker version 17.06.1-ce
ディレクトリ構造
php7testというディレクトリのなかに以下の3つのファイルを作成
Dockerfile
FROM php:7.0-apache MAINTAINER username COPY config/php.ini /usr/local/etc/php/ COPY src/ /var/www/html/
Dockerfileをビルドすることで、オリジナルのイメージを作成することができます。
FROM php:7.0-apache
は、公式のphp:7.0-apache
というイメージを取得する、という意味です。まずイメージを取得し、それのイメージに新しく情報をつけ加えてきます。プログラミング的には、継承の感覚に近いかもしれません。このイメージを取得した時点で、PHP7 とapacheは入っているということです。
MAINTAINER username
はDockerfileの製作者です。自身の名前を入れれば良いですが、必要なければカットしても良い情報です。
COPY config/php.ini /usr/local/etc/php/
では、config
ディレクトリ内につくったオリジナルのPHP設定ファイルを、後々つくられるコンテナ側のOSの/usr/local/etc/php/
下にコピーします。
COPY src/ /var/www/html/
も同じようなものですね。
これで、一度イメージをビルドすれば、コンテナ作成 →動作確認→コンテナ破棄→ホスト側ファイルの修正→コンテナ作成→動作確認のサイクルを確立できます。(srcファイル下であれば、ですが)
src/index.php
<?php phpinfo();
入っているPHPの情報をざっと確認したならこれですよね。
config/php.ini
date.timezone = "Asia/Tokyo"
PHPの設定ファイルです。最初は少しだけの情報にして、上手くいったら追加の設定を書き込んでいくのが安全です。
ビルド
Dockerfileが存在するディレクトリ下でコマンドを実行していきます。
docker build -t php7test .
php7test
の部分はイメージ名です。つけたいイメージ名を書いてください。.
をつけ忘れないようにしましょう。
終了したら、docker images
でイメージが作成された確認しておきます。
ホスト側のブラウザで確認
docker run -v /Users/yourname/php7test/src/:/var/www/html -d -p 8000:80 --name php7cont php7test
php7testというイメージからphp7contというコンテナを作成しています。(コンテナ名を付ける場合は--name
が必要)
docker ps -a
で上手くいっているかチェックしておきます。
PORTS
は0.0.0.0:8000->80/tcp
となっているでしょうか。0.0.0.0
とはlocalhost
のことですね。
http://localhost:8000
にアクセスするとPHPの情報が表示されるはずです。バージョン7が入っていれば成功です。
ネット上の情報をみていると、localhostではダメな場合もあるようで、その場合は次のように、IPアドレスで指定するようですね。 (たぶん、dockerとホストのあいだにvagrantとかを挟んでいるのが原因)
IPアドレス:8000
IPアドレスはifconfig
コマンドで調べることができます。
肝心のコマンドが長いですが、分解すると見えてきます。
1. ホスト・コンテナ間でファイルを共有
docker run -v ホスト側パス:コンテナ側パス
なぜか僕の環境ではホスト側のパスだけフルパスで書かないと上手くいきませんでした。上手くいかないときは試してみてください。
2. コンテナ側のポートをホストでも使えるようにする(ポートフォワード)
docker run -p ホスト側ポート:コンテナ側ポート
3. デタッチモードでコンテナ起動(バックグラウンドで動作)
docker run -d イメージ
php.iniの設定が反映されているか確認
phpinfoで表示した部分をチェックしておきます。
デフォルトのタイムゾーンがAsia/Tokyo
になっていますね。上手くいっているみたいです。
今度イメージを作成するときは、ほかの設定もいじってみましょう。
サイクル体感
docker stop コンテナ名(コンテナID)
でコンテナを停止できます。
docker rm コンテナ名(コンテナID)
でコンテナを削除できます。
src/index.php
を書き換えて、もう一度docker run ~
を実行してみましょう。
ブラウザに書き換えたindex.php
の内容が表示されれば、Dockerによる開発サイクルを実感できるはずです。