Docker Hub の 公式 PHP イメージで、PHP 5.4, 5.5, 5.6 のコンテナを起動します。
PHP Advent Calendar 2014 の 12 日目です。昨日は、PHPで簡単に華麗にDIとAOPをキメる でした。
Docker Hub には、公式でミドルウェアや言語のイメージがで公開されています。PHP もその一つで、現在は、5.4, 5.5, 5.6 が公開されています。また、バージョン毎に複数のタグが存在し、cli / fpm / apache(mod_php) といた構成違いのものが存在します。
https://registry.hub.docker.com/_/php/
ここでは、5.x-apache
タグのイメージを使って、複数バージョンのコンテナを起動して、ブラウザから、同一コンテンツを異なる PHP バージョンで確認できるようにします。
boot2docker のインストールと起動
Docker の実行環境として、boot2docker を使いました。
pkg ファイルが公開されているので、これをダウンロードして、インストールすると良いです。
http://docs.docker.com/installation/mac/
インストールできたら、boot2docker を起動しておきます。
$ boot2docker init $ boot2docker up
boot2docker の VM が起動したら、IP アドレスを確認しておきます。
$ boot2docker ip The VM's Host only interface IP address is: 192.168.59.xxx
公式 PHP イメージでコンテナを起動
Docker Hub 公式の PHP イメージを使って、5.4, 5.5, 5.6 の Docker コンテナを起動します。5.4-apache
/ 5.5-apache
/ 5.6-apache
のイメージは、Apache + mod_php の構成になっており、手軽に Web アプリケーションを実行できます。
実行するコンテンツは、OSX 上にあるファイルを利用します。boot2docker では、1.3 から shared_folder で、OSX の /Users
のディレクトリを、VM から /Users
として参照することができます。これにより、VM の docker コンテナからシームレスに OSX のディレクトリをマウントすることができます。
コンテンツは、単純に PHP バージョンを出力するだけです。
$ cat /Users/path/to/index.php <?php echo 'PHP ' . phpversion();
バージョン毎にポートを分けて、以下のようにコンテナを実行します。初回は、各イメージをダウンロードするので時間がかかります。次回以降は、即座に起動します。
$ docker run -v /Users/path/to:/var/www/html -p 8084:80 -d php:5.4-apache $ docker run -v /Users/path/to:/var/www/html -p 8085:80 -d php:5.5-apache $ docker run -v /Users/path/to:/var/www/html -p 8086:80 -d php:5.6-apache
ブラウザから確認
では、ブラウザから起動した Docker コンテナにアクセスします。ポートを変えて、アクセスすると、それぞれの PHP バージョンが出力されます。
- http://boot2docker-vm:8054/
PHP 5.4.35
- http://boot2docker-vm:8055/
PHP 5.5.19
- http://boot2docker-vm:8056/
PHP 5.6.3
さいごに
Docker Hub 公式の PHP イメージを使って、複数バージョンの PHP を起動しました。
このイメージは、使ってみると分かるのですが、拡張は必要最低限となっており(mbstring も pdo_mysql / pdo_pgsql もありません)、実際のアプリケーションを動かすには、拡張を追加して、ビルドする必要があります。
もちろん、こうした状況は考慮されており、イメージには docker-php-ext-install
という拡張を追加するコマンドが用意されています。
実用する場合は、公式イメージをそのまま使うのではなく、これをベースに Dockerfile を書き、独自に拡張を追加したイメージを使うという方法になりますね。
明日の PHP Advent Calendar 2014は、ngyuki さんです。お楽しみに!
- Newer: 「Jenkinsサーバで使う Docker」を発表してきました
- Older: 自分流 Laravel 4 アプリケーションアーキテクチャ