docker-composeでphp-fpmを使ってphpを動かす方法を紹介

こんにちは!

個人開発者の南です。

今回はdocker-composeを使ってphp-fpmでphpの環境構築をする方法を紹介します。

この記事を読むことで、docker、nginx、php-fpmでphpを動かす環境を作る方法を知ることができます。

用意するもの

今回の記事では、前回紹介した「dockercomposeを使ってnginxサーバーの立ち上げ方法について紹介」の中で紹介したものに追加する形でdocker-composeを行っていきます。

ですので、今回使用するフォルダの構成は下記のようになっていると思います。

今回の記事では上記にphp-fpmの設定を追加して、nginx,php-fpmの構成でphpを動かすというような形にしたいと思います。

php-fpmのフォルダを追加

では、上記のフォルダにphp-fpmの設定を追加するためのフォルダを追加しましょう。

追加したフォルダの中に「Dockerfile」というファイルを作成します。

作成ができたら、今度は「php7.2.ini」というphpの設定ファイルを追加します。

「php7.2.iniファイル」の中身は、Laradockのphp7.2.ini設定ファイルを記載します。

Laradockのphp.ini設定ファイルはこちら

準備すると下記のような形になると思います。

docker-compose.ymlファイルの記述

フォルダの設定ができたら、今度はdocker-compose.ymlに今回使用するphp-fpmの設定を記載していきます。

docker-compose.ymlの記載ができたら、「.env」ファイルの記載も下記のように変更するようにしましょう。

記載の説明

docker-compose.yml内で記載したphp-fpmの説明を紹介します。

buildについて

docker-compose.ymlの中にbuildの項目があります。

これは、php-fpmというフォルダの中にある「Dockerfile」を使って環境を構築しますという意味です。

volumesについて

volumesの部分では、php-fpmのフォルダの中にある「php7.2.ini」ファイルを仮想環境の「/usr/local/etc/php/php.ini」にコピーして使用しますという意味になります。

つまり、実査に使うphpの設定ファイルは「php-fpm/php7.2.iniファイル」のものが反映されます。

exposeについて

exposeでは、docker内でのみアクセスできるポートを開放します。
ここでは、「9000」番ポートを開放して、nginxなどのサービスでアクセスできるようにしておきします。

nginxの設定の修正

docker-compose.ymlでphp-fpmの設定が記述できたら、今度はnginxの設定を変更します。

docker/nginx/sites/app.test-html.confのファイルの中身を下記のように変更します。

fastsgi〜と書かれている部分が、php-fpmを使ってphpの処理を走らせる部分になります。

記載の説明

今回追加した部分に関して説明していきます。

try_filesについて

try_filesは、URLでアクセスした時の設定を記載します。

今回は、「try_files $uri /index.php =404;」という設定にしています。

これは、「http: // test.com/」でアクセスした時に、index.phpを返すという設定になっています。

もし、「index.php」がなければ404エラーを返すというように設定しています。

fastcgi_passについて

fastcgi_passでは、実際に「php」のリクエストが来た時にnginx内のどのサービスを使ってphpのリクエストを処理するかを決めるためのポートを指定します。

phpのリクエストは「php-fpm」を使って処理をするので、「docker-compose.yml」のphp-fpmの項目で開けておいた9000番を指定します。

ちなみにfastcgi_passのところで指定してある「php-fpm:9000」の「php-fpm」は「docker-compose.yml」のものと揃えるようにしましょう。

app.test-html.confの中身

docker-compose.ymlの中身

fastcgi_indexについて

fastcgi_indexでは、URLで何も指定されなかった時に参照されるファイル名を指定します。

http: // test.com/では、まず「index.php」が参照されます。

ただ、http: // test.com/test2.phpなどの場合は、「test2.php」が参照されます。

fastcgi_buffersについて

fastcgi_buffersでは、サーバーのレスポンスを読み込む時のバッファのサイズを指定します。

ちなみに、何も指定しない場合のデフォルトは4Kか8Kのようです。

バッファとは、大量のレスポンスが来た時に順番にさばいていくために、必要なデータを一時的にメモリに置いておいて後で参照することを指します。

fastcgi_buffer_sizeについて

fastcgi_buffersが全体のサイズを決めるのに対して、fastcgi_buffer_sizeでは実際にサーバーからレスポンスを最初に読み込む時のバッファのサイズを指定します。

ちなみに、ここも何も指定しない場合のデフォルトは4Kか8Kのようです。

fastcgi_paramについて

fastcgi_paramは、サーバーに渡される時に必要なものを記述していきます。

今回は下記のように指定してあります。

「$document_root$fastcgi_script_name」の部分は、/info/のリクエストがあった時に「/home/www/scripts/php/info/index.php」というように変更されて解釈されます。

また、phpで「var_export($_SERVER)?>」とすると表示されるものになります。

詳しくは下記参照。
PHP FastCGI の例より

fastcgi_read_timeoutについて

fastcgi_read_timeoutには、サーバーからのレスポンスでタイムアウトする時間を設定します。

include fastcgi_paramsについて

include fastcgi_paramsでは、サーバー内の/etc/nginx/fastcgi_paramsの部分を最後に読み込んでいます。

Dockerfileの編集

nginxの設定が終わったら、最後にdocker/php-fpm/Dokcerfileの設定をしていきます。

Dockerfileでは、下記のように設定していきましょう。

Dockerfile記載の説明

今回追加した部分に関して説明していきます。

FROM部分について

FROMでは、単純にPHPのバージョン7.2の「PHP-fpm」をインストールするというような内容になります。

RUN部分について

RUNでは、記述してあるコマンドを実行するという意味です。

apt-get update部分について

apt-get updateはLinuxのコマンドで、使用するライブリの一覧を更新しています。

(一覧を更新するだけで、実際に使用しているライブリのアップデートが行われるわけではありません。)

apt-get install -yについて

apt-get installで記述されている内容をインストールしていきます。

apt-get install -yの「-y」オプションは、何か問い合わせがあった時にすべて「yes」で答えるというオプションをつけるという意味になります。

インストールしているパッケージについて

ここでは、今回インストールしているパッケージについて紹介します。

default-mysql-clientについて

default-mysql-clientは、MySQLにコマンドを送信して操作するために必要な「MySQL client」のイメージになります。

前までは、mysql-clientだったのですが、mysql-clientで実行すると下記のようにエラーが出るため現在は、「default-mysql-client」を使用するようにします。

E: Package ‘mysql-client’ has no installation candidate in php-fpm image build using docker compose

libmcrypt-devについて

libmcrypt-devは複合・暗号化ライブラリの開発用ファイルになります。

おそらくですが、暗号化を行う系のPHPの関数を行う時に必要なライブラリかと思います。

復号・暗号化ライブラリ開発用ファイルより

libcurl3-devについて

libcurl3-devは、OpenSSLを使う時に使用されるライブラリかと思います。

libcurl3-dev を提供するパッケージより

zip unzipについて

zip unzipは、サーバーの中でファイルをZIP化したり、unzipする時に必要なライブラリです。

pecl install mcrypt-1.0.2について

暗号化をする時に必要なmcryptをperlを使ってインストールしています。

mcryptはPHP7.2で削除されているので、perlを使ってインストールします。

docker-php-ext-install curlについて

docker-php-ext-installとは、PHPの拡張ライブラリなどをDocker内でインストールしやすいように使用するコマンドです。

ここでは、docker-php-ext-installコマンドを使ってcurlをインストールしています。

docker-php-ext-enable mcryptについて

docker-php-ext-enableは、PHPに元々含まれていないソースをPHPでも使用できるように設定するDocker内でのコマンドです。

docker-php-ext-enableを使って、PHP内でmcryptを使えるように設定しています。

docker-php-ext-install pdo_mysqlについて

docker-php-ext-installコマンドを使って、pdo_mysqlをインストールしています。

pdo_mysqlとは、PHPからMySQLのデータベースにアクセスするためのドライバになります。

curl -sS https://getcomposer.org/installer | phpについて

ここでは、curlコマンドを使ってcomposerをダウンロードしています。

mv composer.phar /usr/local/bin/composerについて

mv(move)コマンドを使って、ダウンロードしたcomposerを「/usr/local/bin/composer」に移動させています。

PHPファイルのセット

最後にdocker-compose/htmlの中に「test.php」を作成して実際にPHPが動作するかを確認してみましょう。

ファイルを作成すると下記のような構成になると思います。

最後に、ターミナルなどでdockerフォルダ内に移動して「docker-compose up」コマンドを入力します。

すると、dockerが立ち上がるので、nginxの設定ファイルで設定した「server_name test-html.test」のURL「test-html.test/test.php」にアクセスしてみてください。


下記のように表示されると思います。


コンテナにアクセスする方法

今回のPHPでは、composerをインストールしました。

今後、dokcerでcomposerを使ってlaravelなどのフレームワークをインストールする機会があると思います。

そのときは、下記のコマンドでphpコンテナの中に入ってcomposerコマンドを実行するようにしましょう。

コンテナ名は、docker-composeでスタートした時に表示される名前を指定します。


まとめ

今回の記事で、nginx、php-fpmの組み合わせでサーバーを立ててPHPを動作させることができたと思います。

最後までお読み頂き、ありがとうございました。

この記事を書いた人

南 健太郎

1991年生まれ。都内でエンジニアをしています。
このブログでは、個人開発や日々の技術に関する情報などを発信していきます。