Docker:docker-composeを使ってNginx+Laravelの開発環境を作る方法

こんにちは、さるまりんです。

以前、Dockerでパパッとデータベースを準備する方法を書きました。
今回はNginx+Laravelの開発環境を作ってみます。

Dockerで開発環境を作るのには、2つのファイルDockerfiledocker-compose.ymlを作成します。

それぞれどんなファイルかを思いっきりざっくりと。
docker-compose.ymlにはどんな環境を作成するかを記述し、Dockerfileにはその環境が作成されるときの手順を記述します。
ざっくりすぎてわからないですね。
実際にタイトルの環境を作るためのファイルで見ていきます。

Nginxを動作させる。

まずは開発環境を置くディレクトリを作成します。

mkdir docker-laravel

作成したディレクトリに移動します。

cd docker-laravel

このディレクトリに次の構成で作成していきます。

.
├── docker
│   └── conf
│       └── default.conf
├── docker-compose.yml
└── index.html

docker-compose.ymlにNginxの情報を記述します。

version: '3'
services:
  web:
    image: nginx:1.21.6
    ports:
      - '8000:80'
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html

色々設定が書いてありますね。
services欄のwebがコンテナの名前で、そこにnginxを置くことを示しています。1.21.6dockerhubにあるNginxのイメージのバージョンです。
portsはホスト側のポート8000にアクセスすると、作成されるnginxのポート80にアクセスできるようになる指定です。
volumes欄では
./docker/conf/default.confを作成される環境の/etc/nginx/conf.d/default.conf
現在のディレクトリ(./docker-laravel)を作成される環境の/var/www/html
とする指定をしています。

default.confはNginxの設定ファイルです。

server {
    listen 80;
    root  /var/www/html;
    index index.html;
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
}

最低限の設定です。Nginx webサーバのリクエストはポート80で受けます。rootindexでドキュメントルートとディレクトリ・インデックス名を設定、access_logerror_logでログの出力先を指定しています。

表示するためのindex.htmlも用意します。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>index</title>
</head>
<body>
<h1>トップページ</h1>
<p>docker-composeで作成したlaravel環境トップです。</p>
</body>
</html>

これで次のコマンドを実行します。

docker-compose up -d

これが成功し、ブラウザでhttp://127.0.0.1:8000/にアクセスすると次のように表示されます。

これでDockerでNginx環境は出来ました。

NginxでPHPを動作させる。

次はPHPを動かします。

docker-compose.ymlを編集してservicesphpを追加して動作させるPHPを指定、web欄にも設定を追加します。

version: '3'
services:
  web:
    image: nginx:1.21.6
    ports:
      - '8000:80'
    depends_on:
      - php
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
  php:
    image: php:8.1.4-fpm
    volumes:
      - .:/var/www/html

Nginxの設定もPHPを動作させることができるように編集します。

server {
    listen 80;
    root  /var/www/html;
    index index.php index.html;
    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 php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

上の設定の中で/にアクセスされた時にindex.phpを優先的に表示するようにしたので、PHP版のindex、index.phpを作成します。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>index</title>
</head>
<body>
<h1>トップページ(PHP)</h1>
<p><?php echo "docker-composeで作成したlaravel環境トップです。";?></p>
</body>
</html>

先ほどと同じくdocker-compose up -dで立ち上げて、http://127.0.0.1:8000/にアクセスすると次のように表示されます。
※ Nginxの環境を作ったときのまま動いている状態であれば一度docker-compose downで停止してから再度docker-compose up -dで立ち上げてください。

PHPも動くようになりました。

Laravelをインストールする。

Laravelはcomposerというパッケージ管理システムを利用します。環境作成時にそれを行うための設定をDockerfileに記述します。

docker/phpディレクトリを作成し、そこにDockerfileを作成します。

現在のファイル・ディレクトリ構成はこんな感じです。

.
├── docker
│   ├── conf
│   │   └── default.conf
│   └── php
│       └── Dockerfile
├── docker-compose.yml
├── index.html
└── index.php

docker-compose.yml

version: '3'
services:
  web:
    image: nginx:1.21.6
    ports:
      - '8000:80'
    depends_on:
      - php
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
  php:
    build: ./docker/php
    volumes:
      - .:/var/www/html

servicesphp欄でimageの代わりに、buildDockerfileがあるディレクトリを指定して、そのDockerfileにどんな環境を作成するかを定義します。

Dockerfile

FROM php:8.1.4-fpm
RUN cd /usr/bin && curl -s https://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
    && apt-get install -y git zip unzip vim
WORKDIR /var/www/html

FROMでどのイメージ(どのPHPを使うか)をRUNで実行するコマンド(composerなどをインストールする手順)を記述しています。WORKDIRはコマンドを実行するときどのディレクトリで行うのかを指定しています。

これでdocker-compose up -dで立ち上がると、作成された環境でcomposerを利用してLaravelプロジェクトを作成することができます。

立ち上がったPHPの環境(PHPのコンテナ)に入る。

docker-compose exec php bash

my-appプロジェクトを作成する。

composer create-project --prefer-dist laravel/laravel my-app

このコマンドが成功するとmy-appディレクトリが作成され、その配下にLaravelプロジェクトのファイル群が作成されます。

.
├── docker
│   ├── conf
│   │   └── default.conf
│   └── php
│       └── Dockerfile
├── docker-compose.yml
├── index.html
├── index.php
└── my-app
    └─ (Lavavelプロジェクト)

Nginxの設定を編集する。

Laravelアプリケーションは全てのリクエストを[プロジェクトのディレクトリ/public/index.php]に渡す必要があるのでその設定をします。

server {
    listen 80;
    root  /var/www/html/my-app/public;
    index index.php index.html;
    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 php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

rootでドキュメントルートのディレクトリの指定を/var/www/html/my-app/publicに変更しています。

これでdocker-compose up -dで再度立ち上げ(必要に応じてdocker-compose downしてから)、http://127.0.0.1:8000/にアクセスすると次のように表示されます。

Laravelの初期画面が表示されました!

実際はここにMySQLやPostgreSQLのデータベースを追加したり、redismemcachedを動かしたりといろんなパターンがあると思います。
たくさん試して詳しくなっていきたいと思います。

読んでくださってありがとうございました。

それではまた!