WEB制作
DockerでPHPを実行するコンテナを作る
コンテナイメージをビルドしてコンテナを起動するまでの流れを通して、DockerでPHPの実行環境を構築する方法について解説します。
この記事のポイント
- コンテナの設計図となるDockerfileを作成する
- コンテナイメージをビルド
- コンテナを起動して、ブラウザで出力を確認する
目次
PHPを実行するコンテナとは
今回はPHPを実行することができるコンテナを作っていきます。
必要なファイルは次の2つ。
- Dockerfile
- index.php
コンテナイメージの設計図となる「Dockerfile」と、PHPのプログラムファイルです。
なお、当記事はDockerがインストールされていることを前提としています。
これからインストールする場合は、別記事の「Dockerをインストールする」をご覧ください。
Dockerfileを作成する
まずは、Dockerfileから作成していきます。
コンテナに使用することができるPHPを確認するために、まずはDockerHubを開いてください。
DockerHub
DockerHubのページ上部にある検索スペースに、「php」と入力してみてください。

入力してみると、すぐ下に候補が表示されます。
この中から、一番上にある「php」を選択してください。
「php」を選択すると、phpのコンテナイメージのページが表示されます。

「php」の下をよく見ると、「Docker Official Images」と書かれていますが、これはDocker公認のコンテナイメージであることを示しています。
公認として提供されるコンテナイメージは基本的に安心して活用できるため、もし使いたいコンテナイメージを検索した時に公認のものが表示されたら、特別な理由がない限りはそちらを使うことをオススメします。
他にもubuntuやcentos、ruby、pythonなど多くのメジャーなOS、アプリケーションが公認として提供されているので、自分がよく使うアプリケーションが公認で提供されているか検索してみてください。
コンテナイメージのページをスクロールすると、「DESCRIPTION」「REVIEW」「TAGS」の3つのタブがあります。
「DESCRIPTION」は使用できるアプリケーションのバージョン、クイックリファレンス、コンテナイメージの概要が書かれています。

今回のPHPであれば、次のような「How to use this image」をチェックしておくと導入がスムーズになるヒントになります。
他のコンテナイメージも、同じように基本的な使い方は「DESCRIPTION」に書かれているので確認してみてください。

「DESCRIPTION」からも使用できるコンテナイメージは記載がありますが、一覧の形式で確認したい場合は「TAGS」から確認します。

この「7.3.6-stretch」は「イメージタグ」と呼び、これをDockerfileに記載することで、該当するイメージタグがついたコンテナイメージを使用してコンテナを作ることができます。
今回は安定版で最新の7.3.6、WebサーバーにApacheを使用する「7.3.6-apache-stretch」を使用していきます。
「Dockerfile」というファイルを作成し、次のコードを入力してください。
Dockerfile
FROM php:7.3.6-apache-stretch
びっくりするぐらい完結ですが、今はこの1行だけでOKです。
すでに用意されたコンテナイメージを使う場合は「FROM」を記述し、その後に「コンテナイメージ名:イメージタグ」を指定します。
phpファイルを作成する
引き続き、「index.php」というファイルを作成してPHPコードを入力してください。
index.php
<?php
echo "Hello, PHP on Docker!";
こちらのテキストを出力するだけのシンプルな内容です。
以上でコンテナイメージを作る準備ができました。
現在は同じディレクトリの同階層に次の2つのファイルがある状態になります。
ディレクトリの一覧表示例
# ls
Dockerfile index.php
コンテナイメージをビルドする
いよいよコンテナイメージをビルドしていきます。
PowerShellやターミナルを開き、次のコマンドを入力してください。
まずはcdコマンドなどで、上記のDockerfileやindex.phpがあるディレクトリに移動してください。
移動したら、次のビルドコマンドを入力して実行します。
コマンド入力例
docker build --tag=hellophp .
Dockerのコマンドなので、先頭には「docker」が入ります。
続いて、半角スペースを開けて「build」とビルドコマンドを入力し、続いてオプション「–tag」でイメージタグを「hellophp」に指定しました。
最後にDockerfileの場所を指定します。
今回は現在いるディレクトリが対象となるため「.」を指定します。
ビルドが成功すると、次のような「Successfully …」のメッセージが表示されます。
ディレクトリの一覧表示例
# docker build --tag=hellophp .
Sending build context to Docker daemon 4.096kB
Step 1/1 : FROM php:7.3.6-apache-stretch
---> 731c760de792
Successfully built 731c760de792
Successfully tagged hellophp:latest
コンテナイメージが作成されたか、「docker image ls」コマンドで確認します。
ディレクトリの一覧表示例
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellophp latest 731c760de792 2 hours ago 207MB
先ほど「–tag」で指定したイメージ名「hellophp」でコンテナイメージが表示されていれば成功です。
コンテナを起動する
作成したコンテナイメージから実際にコンテナを起動してみます。
コマンド入力例
# docker run -p 5000:80 -v /Users/test/sites/testphp/:/var/www/html/ -d hellophp
3つのオプションを指定しているためやや長いですが、先頭から解説していきます。
まず、大元の「docker run」はコンテナを起動するコマンドです。
コンテナの起動には元となるコンテナイメージを指定する必要がありますが、それを末尾の「hellophp」で指定しています。
続く「-p 5000:80」はポートを指定しています。
Webサーバーのポートは初期設定で「80」を使用しますが、今回は「5000」に変更しています。
ここの値は使用していないポート番号であれば好きな値で大丈夫です。
その後に続く「-v /Users/test/sites/testphp/:/var/www/html/」は使用するボリュームの指定になります。
ボリュームは「ローカルの絶対パス:コンテナの絶対パス」という形式で指定します。
今回は先ほど作成したindex.phpをコンテナで使用したいので、ローカルの絶対パス「/Users/test/sites/testphp/」を「:」の前に指定し、後ろにコンテナ内のApacheの公開ディレクトリ「/var/www/html/」を絶対パスで指定して結び付けます。
これで、ローカルに作成したindex.phpがコンテナ内のApacheの公開ディレクトリに設置されます。
なお、ボリュームの指定では相対パスを使用できません。
最後の「-d」はコンテナをバックグラウンドで実行するという指定です。
コンテナが正常に起動すると、次のようにコンテナIDが表示されます。
コンテナ起動後の表示例
# docker run -p 5000:80 -v /Users/test/sites/testphp/:/var/www/html/ -d hellophp
bb28772da18ae08112ca9c7a4e09f4b6b3fe97e64818d8bf322d5bc327a0cb56
それでは、ブラウザを開いて確認してみましょう。
URLに「localhost:5000」と入力してページを開いてみてください。

コンテナから出力されたPHPの内容が確認できたでしょうか。
ローカルファイルに作成したindex.phpが、コンテナ内の公開ディレクトリに設置されて実行されたことが確認できました。
このファイルはローカルとリンクしているため、ローカルで編集した内容がすぐに反映されます。
試しに、メッセージを「Hello」から「Hi」に変更してみます。
index.php
<?php
echo "Hi, PHP on Docker!";
変更を保存し、ブラウザを再読み込みしてみましょう。

変更が反映されたでしょうか。
さらに、メッセージ出力に加えて日付を取得して表示してみます。
index.php
<?php
date_default_timezone_set('Asia/Tokyo');
$data = date("Y-m-d");
echo 'Hi, PHP on Docker! Today is '.$data;
タイムゾーンを東京にして、date関数で日付を取得しています。
そして先ほどのメッセージの後ろに加える形で日付を出力する流れです。

実行した時点の日付がちゃんと出力されたでしょうか。
今回は実際にコンテナを作成して、ブラウザで出力を確認してきました。
ローカル環境とコンテナ内のファイルの結び付け、ポート番号の指定なども行い、コンテナの大枠の使用感を掴むことができたでしょうか。
次回は、コンテナイメージをDockerHubで共有して別環境で同じコンテナを実行する方法を解説します。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。