はじめに・環境
意外なことに注意しなければならない点があったため、メモいたします。
$ SW_VERS ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1510 $ $ docker --version Docker version 18.06.0-ce, build 0ffa825 $ docker-compose --version docker-compose version 1.22.0, build f46880f $
Nginx + PHP-FPM のシンプルな docker-compose.yml のポイント
- Nginx コンテナの volumes に HTML を置くディレクトリを指定しないと、HTML を処理してブラウザで表示できない。
- 補足すると、PHP コンテナの volumes に PHP を置くディレクトリを指定してここに HTML ファイルを置いたとしても、その HTML ファイルはブラウザで表示できない。
- 逆も然り。PHP コンテナの volumes に PHP を置くディレクトリを指定しないと、PHP を処理してブラウザで表示できない。
- それぞれのコンテナごとに、必要な volume を省略しないで明確に記述すること。
どういうことか、具体的な記述します。
Nginx コンテナの volumes に、- ./data/html:/var/www/html と書いています。
そして、PHP コンテナの volumes に - ./data/html:/var/www/html と書いています。
これらはどちらも同じ内容です。
HTML ファイルは Nginx を通して、PHP のファイルも Nginx を経由して処理しています。
そのため、どちらかの volumes の記述だけでも問題なく HTML も PHP も処理できるのでは?と予想しました。
ダメでした><。
Nginx コンテナの volumes のみ指定すれば HTML ファイルのみブラウザで表示できました。
PHP コンテナの volumes のみ指定すれば PHP ファイルのみブラウザで表示できました。
Nginx および PHP コンテナの volumes 療法を指定すれば HTML および PHP のファイル両方をブラウザで表示できました。
PHP は、Nginx -> PHP-FPM と経由して処理するため、volumes の設定は必須とも言えるのは納得できます。
HTML は、Nginx を通って処理しますけれども、PHP-FPM の volumes にディレクトリが設定されているので、Nginx 側の volumes 設定は無くてもよいと思ってしまいました。
ダメなんですね。
なんとなく不思議な感じがしますが、コンテナごとに必要な volumes はサボらず明示していく、という方針を覚えておきましょう。
Nginx + PHP-FPM のシンプルな docker-compose.yml の内容
docker-compose up 後、http://localhost で表示できる内容となっています。
version: '3'
services:
web:
image: nginx:alpine
ports:
- 80:80
depends_on:
- app
volumes:
- ./web/default.conf:/etc/nginx/conf.d/default.conf
- ./data/html:/var/www/html
app:
image: php:fpm-alpine
ports:
- 9000:9000
volumes:
- ./data/html:/var/www/html
server {
listen 80;
server_name _;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(\.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
おわりに
シンプルな例で、とても重要なことを学習できたように思います。
今後、複雑な事例に取り組んでいく中で、つまづきとなりうるポイントを、ひとつ知ることができてとても嬉しいです。
以上です。
