入社して初めてのプロジェクトで docker-compose.yml を使い、Laravel の開発環境を構築してみた (2 / 3)

HBSS 所属の Awano です。こちらは前回のブログのタイトルの続きとなります。

第2回は、 docker-compose.yml による nginx ( default.conf ) の設定方法を解説したいと思います。
まずは Docker による環境構築のディレクトリ・ファイル構造を改めてご覧下さい。

docker-compose.yml に nginx の設定を追加する

では docker-compose.yml に、新たに.nginx の項目を追加します(ピンク文字)。


version: "3"

services:
    php_docker:
        container_name: php_example   // コンテナ名(PHPのコンテナである事が分かる名前に)
        build: ./docker/php
        volumes:
        -   ./application:/var/www/html
        ports:
        -   "3001:3001"   // 3000番はデフォルトで使用している事がある為、3000番以外の任意の番号で

    nginx_docker:
        image: nginx:latest
        container_name: nginx_example
        ports:
        -   8081:81
        volumes:
        -   ./application:/var/www/html
        -   ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            -   php_docker

docker-compose.yml 内の nginx に関する項目を見てみましょう。


image: nginx:latest

nginx のイメージですが、docker-compose.yml にてバージョンを指定します。最新バージョンを使用するので、nginx の後に :latest を付けて下さい。


volumes:
-   ./application:/var/www/html
-   ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf

ローカル側の application ディレクトリと、サーバー側の /var/www/html をリンクさせています。また、nginx の設定を行う default.conf ファイルについても、ローカル側とサーバー側の URL をそれぞれ設定させています。
default.conf ファイルの指定場所はローカル側では任意の URL で構いませんが、サーバー側は必ず上記 URL に指定して下さい。


depends_on:
    -   php_docker

depends_on とは、コンテナの依存関係の定義です。この書き方の場合、「 nginx_docker コンテナは php_docker コンテナに依存している 」という解釈となります。
依存はコンテナ起動順序に影響し、ここでは php コンテナが起動してから nginx コンテナが起動する、という順序となります。

default.conf の設定

では nginx の設定ファイルである default.conf の完成形を見てみましょう。


server {
    listen       81;
    index index.php index.html;
    root /var/www/html;

    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php_docker:9000;
        fastcgi_index index.php;
        include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

1つ1つ解説していきます。


ports:
-   8081:81
volumes:
-   ./application:/var/www/html


listen       81;
index index.php index.html;
root /var/www/html;

location / {
    root /var/www/html;
    try_files $uri $uri/ /index.php?$query_string;
}

default.conf 内の listen は nginx サーバー側のポート番号です。docker-compose.yml の ports 項目の番号(右側)と同じに設定します。
また、root とはサーバー側でのトップページに当たるので、基本は /var/www/html としています。
location / 内の root については、docker-compose.yml のvolumes 右側のURL ( /var/www/html ) と同一にして下さい。

try_files とは、左から指定した順番で URL の確認および転送を行う指示を出せる項目です。ここでは、
( 1 ) $url → URL のパスにファイルがあるか
( 2 ) $uri/ → ( 1 ) が存在しなかった場合に、URL のパスにディレクトリがあるか
( 3 ) /index.php … → ( 1 ) ( 2 ) 共に存在しなかった場合、指定したロケーションに行く
となります。


location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php_docker:9000;
    fastcgi_index index.php;
    include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

Location ~ \.php$ ですが、「 .php 」拡張子のファイルを指定された際に実行した結果を確実に返す為の項目です。
ここは上記コードをテンプレートとして考えてそのまま入力して下さい。ただし、ピンク文字の箇所は php のサービス名( php_docker )と一致させる必要があります。

default.conf の書き方はほぼテンプレートとして考えてもらって構いません。URL の指定部分を docker-compose.yml に合わせる事に気を付ければ問題ありませんので。

次回は実際にビルドを行い、 Laravel のインストールとデータベースの設定をしていきたいと思います。