こんにちは!
個人開発者の南です。
今回はdocker-composeを使ってphp-fpmでphpの環境構築をする方法を紹介します。
この記事を読むことで、docker、nginx、php-fpmでphpを動かす環境を作る方法を知ることができます。
用意するもの
今回の記事では、前回紹介した「dockercomposeを使ってnginxサーバーの立ち上げ方法について紹介」の中で紹介したものに追加する形でdocker-composeを行っていきます。
ですので、今回使用するフォルダの構成は下記のようになっていると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
dockerfolder | docker-compose/ | docker-compose.yml | nginx/ | DockerFile | nginx.conf | sites/ | app.test-html.conf | ssl/ | html/ | index.html |
今回の記事では上記にphp-fpmの設定を追加して、nginx,php-fpmの構成でphpを動かすというような形にしたいと思います。
php-fpmのフォルダを追加
では、上記のフォルダにphp-fpmの設定を追加するためのフォルダを追加しましょう。
追加したフォルダの中に「Dockerfile」というファイルを作成します。
作成ができたら、今度は「php7.2.ini」というphpの設定ファイルを追加します。
「php7.2.iniファイル」の中身は、Laradockのphp7.2.ini設定ファイルを記載します。
準備すると下記のような形になると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
dockerfolder | docker-compose/ | docker-compose.yml | nginx/ | DockerFile | nginx.conf | sites/ | app.test-html.conf | ssl/ | php-fpm/ | Dockerfile | php7.2.ini | html/ | index.html |
docker-compose.ymlファイルの記述
フォルダの設定ができたら、今度はdocker-compose.ymlに今回使用するphp-fpmの設定を記載していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
version: '3' services: nginx: build: context: ./nginx volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} - ${NGINX_HOST_LOG_PATH}:/var/log/nginx - ${NGINX_SITES_PATH}:/etc/nginx/sites-available - ${NGINX_SSL_PATH}:/etc/nginx/ssl ports: - "${NGINX_HOST_HTTP_PORT}:80" - "${NGINX_HOST_HTTPS_PORT}:443" depends_on: - php-fpm php-fpm: build: context: ./php-fpm args: - PHP_VERSION=${PHP_VERSION} volumes: - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} expose: - "9000" |
docker-compose.ymlの記載ができたら、「.env」ファイルの記載も下記のように変更するようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
VOLUMES_DRIVER=local ### Paths ################################################# # Point to the path of your applications code on your host APP_CODE_PATH_HOST=../ # Point to where the `APP_CODE_PATH_HOST` should be in the container APP_CODE_PATH_CONTAINER=/var/www # You may add flags to the path `:cached`, `:delegated`. When using Docker Sync add `:nocopy` APP_CODE_CONTAINER_FLAG=:cached ### NGINX ################################################# NGINX_HOST_HTTP_PORT=80 NGINX_HOST_HTTPS_PORT=443 NGINX_HOST_LOG_PATH=./logs/nginx/ NGINX_SITES_PATH=./nginx/sites/ NGINX_PHP_UPSTREAM_CONTAINER=php-fpm NGINX_PHP_UPSTREAM_PORT=9000 NGINX_SSL_PATH=./nginx/ssl/ ### PHP-FPM ################################################# PHP_VERSION=7.2 |
記載の説明
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のファイルの中身を下記のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
server { listen 80; listen [::]:80; # For https # listen 443 ssl default_server; # listen [::]:443 ssl default_server ipv6only=on; # ssl_certificate /etc/nginx/ssl/default.crt; # ssl_certificate_key /etc/nginx/ssl/default.key; server_name test-html.test; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php$is_args$args; } #新しく追加する部分。 location ~ \.php$ { try_files $uri /index.php =404; fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 600; include fastcgi_params; } #新しく追加する部分。 location ~ /\.ht { deny all; } } |
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の中身
1 2 |
#php-fpmをdocker-compose.ymlのところと揃える。 fastcgi_pass php-fpm:9000; |
docker-compose.ymlの中身
1 2 3 4 5 6 7 8 9 10 11 |
#ここの名前をconfのところに指定する。 php-fpm: build: context: ./php-fpm args: - PHP_VERSION=${PHP_VERSION} volumes: - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} expose: - "9000" |
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は、サーバーに渡される時に必要なものを記述していきます。
今回は下記のように指定してあります。
1 |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
「$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では、下記のように設定していきましょう。
1 2 3 4 5 6 7 8 9 |
FROM php:7.2-fpm RUN apt-get update && apt-get install -y default-mysql-client libmcrypt-dev libcurl3-dev zip unzip \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-install curl \ && docker-php-ext-enable mcrypt \ && docker-php-ext-install pdo_mysql \ && curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer |
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を使う時に使用されるライブラリかと思います。
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が動作するかを確認してみましょう。
ファイルを作成すると下記のような構成になると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
dockerfolder | docker-compose/ | docker-compose.yml | nginx/ | DockerFile | nginx.conf | sites/ | app.test-html.conf | ssl/ | php-fpm/ | Dockerfile | php7.2.ini | html/ | index.html | test.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コマンドを実行するようにしましょう。
1 |
docker exec -t -i 入りたいコンテナ名 bash |
コンテナ名は、docker-composeでスタートした時に表示される名前を指定します。
まとめ
今回の記事で、nginx、php-fpmの組み合わせでサーバーを立ててPHPを動作させることができたと思います。
最後までお読み頂き、ありがとうございました。