「Docker」を利用して作るモダンなPHPの開発環境
いまさらですが、Docker使っていますか?
アーティスでも少し前からDockerを利用して開発するようになりました。Dockerをご存じではない方に簡単に説明しておきますと、Dockerはすごく軽量な仮想化環境です。
仮想化技術といえばVMwareやVirtualBoxなどが有名でアーティスでも利用していますが、これらの仮想化技術はマシンレベルでの仮想化を行いますが、DockerはOSレベルでの仮想化を行います。
Dockerでの仮想化環境は、ホストのLinuxカーネルを共有しているのでオーバヘッドが小さく、既存の仮想化技術と比較した場合、軽くて速いことが特徴です。
そんな開発が捗るDockerなのですが、少しとっつきにくい部分もあるので、PHP7+Apacheで必要最低限の開発環境を作る方法を紹介してみたいと思います。
ここから先の内容は、ホストOS側にDockerがインストール済みである事を前提にしています。Dockerがインストールされていない場合は、書籍やサイトを参考にしてインストールしてください。
INDEX
Docker Hubから元となるイメージを選ぶ
Dockerでコンテナ(仮想化環境)を構築するためには、コンテナの元となるイメージが必要です。
イメージを自分で構築することもできますが、公式のDocker Hubでは様々なイメージが公開されています。
今回は手軽に構築したいので公式のイメージを利用します。
下記のURLがPHPの公式リポジトリです。
「Supported tags and respective Dockerfile links」の下部にズラズラとPHPのバージョンらしきものが書かれていると思います。これらはtagとよばれるもので、イメージの内容を表しています。
今回は、PHP7.0.21とApacheが一つのコンテナに含まれている「7.0.21-apache」を使うことにします。
イメージをビルドするためのDockerfileを作る
使うイメージが決定したので、実際にこのイメージをつかってコンテナを構築します。
まず、適当なディレクトリ(php7-apache)を作成して、その中に「Dockerfile」を作成します。
$ mkdir php7-apache
$ cd php7-apache/
$ touch Dockerfile
Dockerfileに以下の内容を書き込みます。
FROM php:7.0.21-apache
RUN docker-php-ext-install -j$(nproc) pdo_mysql
FROMは、ベースとなるイメージとタグを指定しています。
RUNは、ビルド時に実行されるコマンドです。
PHPモジュールは、docker-php-ext-installの後ろに追加して指定します。
今回は使う予定はないですが、インストールの確認用にpdo_mysqlを追加しています。
「docker build」コマンドを実行するとビルドが開始されて、自動的に指定したイメージがダウンロードされます。
$ docker build ./ -t php7_apache
「-t」は、ビルドするイメージにつけるリポジトリ名とタグを指定します。
「docker images」コマンドを実行してビルドされたイメージを確認してみます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php7_apache latest 8ae1f1661332 16 hours ago 389.6 MB
イメージをビルドできたのが確認できますね!
データの永続化のためにマウント用のディレクトリをつくる
コンテナの中のファイルは永続化されないので、ホスト側のディレクトリをコンテナ側にマウントする必要があります。
同じディレクトリ内にマウント用のディレクトリを作成しておきます。
$ mkdir html
このディレクトリをコンテナ側の/var/www/htmlにマウントします。現在のディレクトリ構造は以下のようになっています。
php7-apahce — Dockerfile — html |
コンテナを起動してみる
準備ができたので、「docker run」コマンドを実行してコンテナを起動します。
$ docker run -d -p 80:80 -v /home/hoge/php7-apache/html:/var/www/html --name php7-apache php7_apache
「-d」は、バックグラウンドで実行するオプションです。
「-p」は、ポートの設定で、ホスト側:ゲスト(コンテナ)側で指定します。
「-v」は、volumeの指定で、マウントしたいディレクトリを、ホスト側のパス:ゲスト側のパスで指定します。
「–name」は、コンテナに「php7-apache」という名前を指定しています。(名前を指定していないと自動的に付けられます。)
最後の「php7_apache」で先程ビルドしたイメージ名(リポジトリ名)を指定します。
コンテナが起動しているのを確認するために、「docker ps」コマンドを実行してみます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a4eb62b45ae php7_apache "docker-php-entrypoin" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp php7-apache
問題なく起動していますね!
コンテンツを置いて動作確認する
動作確認のために、phpinfo関数を実行するphpinfo.phpをコンテナ内に置いて実行してみます。
ホスト側のvolumeに指定したhtmlディレクトリ内にファイルを作成します。
$ touch phpinfo.php
適当なエディタで以下の内容を書き込みます。
<?php
phpinfo();
ブラウザでホスト側のIPを指定するとphpinfoの実行結果が表示されます。
以上で簡単な開発環境が構築できました。
さいごに
Dockerのメリットとデメリットを確認しておきます。
メリット
- ゲストOS側にそれぞれカーネルを持つ必要が無いため、リソースの消費が節約できる。(軽い)
- ゲストOS側でカーネルを立ち上げる必要がないので、ゲストOSの起動が高速。(速い)
デメリット
- ホストと違う種類のOSをゲストに利用できない。(LinuxのゲストにWindowsのホストを載せることはできない。)
- カーネルは共有されるので個別の設定ができない。
アーティスでは、開発時はもちろん、バージョンが異なるミドルウェア環境での検証や、自動テストの実行環境としてDockerを利用して開発効率を高めています。
この記事を書いた人
- 創造性を最大限に発揮するとともに、インターネットに代表されるITを活用し、みんなの生活が便利で、豊かで、楽しいものになるようなサービスやコンテンツを考え、創り出し提供しています。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー