はじめに・環境
意外なことに注意しなければならない点があったため、メモいたします。
$ 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; } }
おわりに
シンプルな例で、とても重要なことを学習できたように思います。
今後、複雑な事例に取り組んでいく中で、つまづきとなりうるポイントを、ひとつ知ることができてとても嬉しいです。
以上です。