Dockerを使ったPHPアプリケーションの開発例
Dockerのインストールが完了したので、次は具体的にPHPによるWebアプリケーションの開発の例について説明します。
Webアプリ開発におこりがちなトラブル
PHPに限らず、大規模なWebアプリケーション開発では、デザイナ・フロントエンジニア・サーバサイドエンジニアなどが分業で並行開発を行うことが多くなっています。
そのため、Webアプリケーション開発者であれば
「私のパソコン上だと正しく動いているのですが……」
「こちらのサーバでは動きますが、別のサーバにデプロイするとエラーが出ます。」
などのトラブルに悩まされる人も多いのではないかと思います。
これらの原因は、OSネットワークミドルウエアの設定やバージョン、アプリケーションが利用するライブラリの有無やバージョン差異など、インフラ環境の不整合によって生じている場合がほとんどです。
Dockerは、コンテナ仮想化技術を用いて、これらアプリケーションを実行させるために必要なインフラ環境とアプリケーションの実行モジュールを「Dockerイメージ」にまとめてパッケージングします。Dockerでは、このパッケージングしたDockerイメージをもとにコンテナを動作させます。Dockerイメージは、どの環境でも同じように動作します。
Dockerと貨物コンテナ
貨物輸送で利用されるコンテナは、野菜であろうが、穀物であろうが、資材であろうが、車であろうが、積み込まれている荷物の中身を意識せず、どこにでもコンテナ船で輸送できることで、流通のしくみに大きな変革をもたらしました。Dockerも、開発用のパソコンからオンプレミスの本番環境のサーバ、さらにはクラウド上の仮想サーバにいたるまで、どこでもアプリケーションを実行させることができるため、アプリケーションの開発のしかたを大きく変える可能性があります。アプリケーションの開発のしかたが変わるということは、つまりエンジニアの働き方も大きく変わってくる可能性があります。
Dockerコンテナの起動とアプリケーション開発
それでは、具体的にPHPによるWebアプリケーション開発のためのDockerイメージを作成します。Kitematicの画面で[NEW]ボタンをクリックし、検索ボックスに「docker-kitematic」と入力しイメージを検索します。
イメージは、次の命名規則で名前が付けられています。
ユーザ名/イメージ名
ここでは、「asashiho」というユーザが作成した「docker-kitematic」という名前のイメージを選択し、[CREATE]ボタンをクリックします。
コンテナが起動すると、次のような画面になります。
PHPのアプリケーションはパソコン上の以下のフォルダに配置します。
C:\Users\<ユーザ名>\Documents\Kitematic\docker-kitematic\var\www\html
今回は、動作確認のため、以下の内容のindex.htmlをhtmlフォルダに配置します。
<?php
phpinfo();
?>
クライアントPCにアプリケーションサーバやPHPをインストールすることなくアプリケーション開発を行うことができます。バージョン差異やライブラリの有無も気にすることなく、プログラムをフォルダに配置するだけで開発やテストをすすめることができます。
Dockerイメージの作りかた
それでは、このWebアプリケーションの実行環境のもとになるDockerイメージを作成してみます。残念ながら、執筆時のKitematicは、DockerイメージをGUIから作成できないため、コマンドラインからの操作になります。
まず、Dockerイメージを作成するもとになるDockerfileを作成します。このDockerfileはDockerイメージのインフラ構成情報(OSの種類やバージョン/ミドルウエアの構成/ネットワーク/デーモンプロセスの起動)をテキストファイルで記述したものになります。
このDockerfileを、パソコン上の任意のフォルダ内に作成します。筆者の環境では、Eドライブ配下にdocker-phpというフォルダを作成し、その中にDockerfileという名前のテキストファイルを作成しています。なお、Dockerfile中の#はコメント行です。
Dockerfileを次のように記述します。
# 1.ベースイメージの取得 FROM centos:latest # 2.作成者情報 MAINTAINER 0.1 asashiho@mail.asa.yokohama # 3.Apache HTTP ServerとPHPのインストール RUN ["yum", "-y", "install", "epel-release"] RUN ["rpm", "-ivh", "http://rpms.famillecollet.com/enterprise/remi-release-7.rpm"] RUN ["yum", "-y", "install", "httpd"] RUN ["yum", "-y", "install", "--enablerepo=remi-php56", "php", "php-mbstring", "php-pear"] # 4.Webコンテンツの配置 VOLUME ["/var/www/html"] # 5.ポートの解放 EXPOSE 80 # 6.httpdの実行 CMD ["/usr/sbin/httpd","-D", "FOREGROUND"]
このDockerfileでは、CentOSの最新バージョンにApache Httpd ServerとPHPをインストールし、Webコンテンツを配置するディレクトリ/var/www/htmlを割り当てています。またHTTP通信を行うため、80番ポートを解放し、httpdデーモンをコンテナのプロセスとして起動するよう設定しています。他の設定やライブラリなどを行うときは、このDockerfileを修正します。Dockerfileの命令の詳細については、以下の連載を参照して下さい。
Dockerfileをビルドすることで、Dockerイメージを作成できます。Kitematicの場合、画面左下の[DOCKER CLI]ボタンをクリックします。すると、Powershellが起動します。
Dockerfileを格納したディレクトリに移動し、次のコマンドを実行します。これで作成したDockerfileをもとに「docker-php」という名前のDockerイメージが生成されます。
PS E:\docker-php> docker build -t docker-php .
これで、ローカルのパソコン内にDockerイメージが生成できました。これを開発チーム内で共有できるようDocker Hubにアップロードします。Docker Hubにアップロードするためには、Dockerイメージにタグをつける必要があります。たとえばdocker-phpという名前のイメージに対して、Docker Hubユーザ名がasashihoでイメージ名がdocker-php(最新版:latest)というタグをつけるときは次のコマンドを実行します。なお、ユーザ名はDocker Hub登録時の名前に読み替えてください。
PS E:\docker-php> docker tag docker-php asashiho/docker-php:latest
イメージにタグが設定できたら、Docker Hubにログインしてイメージをアップロードします。
PS E:\docker-php> docker login -u <ユーザ名> -p <パスワード> -e <Eメール> PS E:\docker-php> docker push <ユーザ名>/docker-php:latest
これで、Docker Hubへのアップロードが完了しました。Kitematicから検索するとイメージが生成されているのが分かります。
チームでWebアプリケーション開発を行っている場合は、Dockerイメージをチーム内で共有して開発を進めれば、インフラ環境が起因でおこるトラブルを減らすことができます。
なお、Kitematicは、現在α版のリリースであり、機能もまだ揃っていません。そのため、コマンドラインでの操作が必要な部分もありますが、Dockerの開発スピードは非常に早く、すべての操作をGUIから出来るようになるのも、時間の問題だと考えています。
おわりに
今回の記事では、話題のDockerをGUIで操作できる「Docker Kitematic」を簡単に紹介しました。Kitematicを使えば、インフラ構築やコマンド操作に不慣れなデザイナや開発者の負荷を減らし、本業のWebデザインやコーディングに注力できます。筆者はDockerの魅力の一つは「簡単である」ことだと考えています。とりあえず、Docker使ってみました! という人が増えるといいなと思っています。
