WebEngine

だらだらと綴る技術系メモ

DockerfileでPHP7環境構築

f:id:web-engine:20171023213836j:plain

今回、Docker HubにあるPHP公式リポジトリCreate a Dockerfile in your PHP projectの部分を参考にしました。

環境

mac OS Sierra上にDocker for macPHP7 + apacheの環境を構築していきます。今はnginxが主流となりつつありますが、トラブルシューティングしやすいように、今回は慣れているapacheを使います。

  • Docker version 17.06.1-ce

ディレクトリ構造

php7testというディレクトリのなかに以下の3つのファイルを作成

  • Dockerfile
  • src/index.php
  • config/php.ini


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で上手くいっているかチェックしておきます。

PORTS0.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で表示した部分をチェックしておきます。

f:id:web-engine:20171022214141p:plain デフォルトのタイムゾーンAsia/Tokyoになっていますね。上手くいっているみたいです。
今度イメージを作成するときは、ほかの設定もいじってみましょう。

サイクル体感

docker stop コンテナ名(コンテナID)でコンテナを停止できます。
docker rm コンテナ名(コンテナID)でコンテナを削除できます。
src/index.phpを書き換えて、もう一度docker run ~を実行してみましょう。
ブラウザに書き換えたindex.phpの内容が表示されれば、Dockerによる開発サイクルを実感できるはずです。

参考