「Docker」を利用して作るモダンなPHPの開発環境
いまさらですが、Docker使っていますか?
アーティスでも少し前からDockerを利用して開発するようになりました。Dockerをご存じではない方に簡単に説明しておきますと、Dockerはすごく軽量な仮想化環境です。
仮想化技術といえばVMwareやVirtualBoxなどが有名でアーティスでも利用していますが、これらの仮想化技術はマシンレベルでの仮想化を行いますが、DockerはOSレベルでの仮想化を行います。
Dockerでの仮想化環境は、ホストのLinuxカーネルを共有しているのでオーバヘッドが小さく、既存の仮想化技術と比較した場合、軽くて速いことが特徴です。
そんな開発が捗るDockerなのですが、少しとっつきにくい部分もあるので、PHP7+Apacheで必要最低限の開発環境を作る方法を紹介してみたいと思います。
ここから先の内容は、ホストOS側にDockerがインストール済みである事を前提にしています。Dockerがインストールされていない場合は、書籍やサイトを参考にしてインストールしてください。
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」を作成します。
1 2 3 |
$ mkdir php7-apache $ cd php7-apache/ $ touch Dockerfile |
Dockerfileに以下の内容を書き込みます。
1 2 |
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」コマンドを実行するとビルドが開始されて、自動的に指定したイメージがダウンロードされます。
1 |
$ docker build ./ -t php7_apache |
「-t」は、ビルドするイメージにつけるリポジトリ名とタグを指定します。
「docker images」コマンドを実行してビルドされたイメージを確認してみます。
1 2 3 |
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE php7_apache latest 8ae1f1661332 16 hours ago 389.6 MB |
イメージをビルドできたのが確認できますね!
データの永続化のためにマウント用のディレクトリをつくる
コンテナの中のファイルは永続化されないので、ホスト側のディレクトリをコンテナ側にマウントする必要があります。
同じディレクトリ内にマウント用のディレクトリを作成しておきます。
1 |
$ mkdir html |
このディレクトリをコンテナ側の/var/www/htmlにマウントします。現在のディレクトリ構造は以下のようになっています。
php7-apahce — Dockerfile — html |
コンテナを起動してみる
準備ができたので、「docker run」コマンドを実行してコンテナを起動します。
1 |
$ 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」コマンドを実行してみます。
1 2 3 |
$ 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ディレクトリ内にファイルを作成します。
1 |
$ touch phpinfo.php |
適当なエディタで以下の内容を書き込みます。
1 2 3 |
<?php phpinfo(); |
ブラウザでホスト側のIPを指定するとphpinfoの実行結果が表示されます。
以上で簡単な開発環境が構築できました。
さいごに
Dockerのメリットとデメリットを確認しておきます。
メリット
- ゲストOS側にそれぞれカーネルを持つ必要が無いため、リソースの消費が節約できる。(軽い)
- ゲストOS側でカーネルを立ち上げる必要がないので、ゲストOSの起動が高速。(速い)
デメリット
- ホストと違う種類のOSをゲストに利用できない。(LinuxのゲストにWindowsのホストを載せることはできない。)
- カーネルは共有されるので個別の設定ができない。
アーティスでは、開発時はもちろん、バージョンが異なるミドルウェア環境での検証や、自動テストの実行環境としてDockerを利用して開発効率を高めています。

アーティス

最新記事 by アーティス (全て見る)
- コンテンツマーケティングが選ばれる理由!オウンドメディアやSNSを活用して売上を伸ばそう - 2019年10月30日
- 迷惑メール対策には複数のメールアドレス(サブアドレス)を使って対処しよう - 2019年8月7日
- SNSマーケティングがBtoCビジネスに適している理由!SEOマーケティングは時代遅れ? - 2019年6月28日
- webメディアにおけるSEO対策のためのGoogle Analyticsとサーチコンソールの活用方法 - 2019年4月15日
- Instagramに適した商品とは? 基本的な機能・活用方法・運用ポイントについて徹底解説 - 2019年3月19日
おすすめ関連記事
最新記事