【Docker】Nginx + PHP-FPM のシンプルな docker-compose.yml のポイントをノートしました

スポンサードリンク


はじめに・環境

意外なことに注意しなければならない点があったため、メモいたします。

$ 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;
    }
}

おわりに

シンプルな例で、とても重要なことを学習できたように思います。

今後、複雑な事例に取り組んでいく中で、つまづきとなりうるポイントを、ひとつ知ることができてとても嬉しいです。

以上です。

コメントを残す