PHP実行環境を色々試す! 2016年はDockerコーデで決まり!


こんにちは。
開発チームのワイルド担当、まんだいです。

dockerでオシャンティな開発環境を作りたいなら、docker buildでオリジナルのdockerイメージを作ってみるのはいかがでしょう?
着回しやすいdockerイメージを持っていると、アレンジにも幅が出るはず!

こちらはdocker入門シリーズの1記事として書かれています。
過去のdocker入門シリーズをお読みになりたい場合は、以下のリンクより辿ってみてください。

なお、今回はコピペではできないため、コピペでできるシリーズではありません。悪しからず。

 

PHPの実行環境について

docker hubに並んでいるdockerイメージは、かなり優秀で、そのまま使っても全く問題ないですが

  • 例えばソースファイルを置くディレクトリには、もうちょっとこだわりを出したいとか
  • PHPからffmpegを使って、音声ファイルのエンコードをしたいとか
  • 拡張モジュールをズコズコつっこんだPHPを使いたいとか

そういう要求に応えるためには、dockerイメージを独自に再構築するしかないと思います。

既存のdockerイメージに変更を加えて、再度ビルドする事で対応できる場合は多いですが
PHPのコンパイルの時点でモジュールを入れてしまう事も可能です。

dockerのビルドはDockerfileが手順書になっていて、それを見れば何をどうしているのか一目瞭然です。
つまりは、自分が今使っているdockerイメージも、どこかにDockerfileがあり
そのDockerfileに少しの修正を施しビルドすれば、自分が欲する最適なdockerイメージが手に入るという事です。

更には、Dockerfileもあろうことかgithubにアップされ、オープンになっているものも多い(オフィシャルのdockerイメージであればあるほどその傾向が強い)ので、色んなDockerfileを見て、やり方を盗むには持って来いです。

今回は、PHPの公式dockerイメージを参考に、マルチバイト対応済みのPHPが入ったdockerイメージを作ってみたいと思います。

 

まずは、ベースになるdockerイメージを探す

docker hubに並んでいるdockerイメージを見れば、自分が作りたいものに近いdockerイメージを探す事は簡単です。
今回は、PHPの公式dockerイメージをベースに、修正を加えてみたいと思います。
ページを見てみると、github上で管理されているDockerfileへのリンクがあります。

(7.0/apache/Dockerfile) というリンクをたどると、PHP7.0系 + apacheのdockerイメージ作成用のDockerfileが見えました。
これをたたき台にしてみます。
VMで、このリポジトリをgit cloneし、修正をしてみましょう。

cd ~
vagrant@vagrant:~$ git clone https://github.com/docker-library/php.git
vagrant@vagrant:~$ cd /home/vagrant/php/7.0/apache

./configure のオプションに、「–enable-mbstring」を追記します。
また、テスト用のPHPファイルを作成し、dockerイメージにCOPYします。

vi Dockerfile

# Dockerfile 59行目付近
        && ./configure 
                --enable-mbstring                             # ← 追記
                --with-config-file-path="$PHP_INI_DIR" 

# 以下のCOPY命令をDockerfileの適当なところに追記
# 私は、WORKDIR /var/www/html の前に追記しました。

COPY mbstring.php /var/www/html/

 

docker buildでPHPのコンパイルをやってみる

修正できたら、mbstring.phpを作成します。

echo "<?php echo mb_convert_kana('1234567890', 'N');" > mbstring.php 

作成できたら、docker buildをやってみます。

vagrant@vagrant:~/php/7.0/apache$ docker build -t myphp7 .

このbuildでは、前回とは違って、apt-getのアップデートなどがガンガン動くので、ビルドするのに結構時間が掛かります。
ビルドが完了したら、dockerイメージからdockerコンテナを作成してみましょう。

vagrant@vagrant:~/php/7.0/apache$ docker run -it myphp7 /bin/bash
root@66c8bbc720a9:/var/www/html# ls
mbstring.php
root@66c8bbc720a9:/var/www/html# service apache2 start
[....] Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
. ok
root@66c8bbc720a9:/var/www/html# curl http://localhost/mbstring.php
1234567890root@66c8bbc720a9:/var/www/html#

半角数字を全角数字にコンバートする命令を実行して、終了する感じですが、問題なくコンバートできていますね。

イチから自分でする必要はなくて、比較的プレーンなDockerfileを探して、たたき台にするとビルドまで手早く持ってこられるんじゃないかと思います。
phpのオフィシャルdockerイメージはvimも入っていないので、中でコンフィグを修正したりする場合は、apt-getでvimをインストールしておけば問題ないでしょう。

vagrantを使って仮想環境を作ると、どうしてもファイルサイズが気になるところですが
dockerイメージを作成する場合、1/4のサイズで収まりましたので(もちろん、PHPの実行環境のみですが)共有するのもお手軽ですね。
そもそもDockerfileとdockerイメージに入れるファイルだけを共有すれば、gitリポジトリで管理する事も容易いです。

コンパイル処理全体をコマンド化できるというのは、開発の初期に環境構築する上でも非常にメリットが多いので
apt-getやyumに頼りきらず、最適なコンパイルオプションを付けて、最適な実行環境を用意できるようになりたいものです。

以上です。


この記事をかいた人

About the author