🚀

Laravel Sailはもう古い?DockerでモダンなLaravel開発環境を構築する手順

に公開

はじめに

Laravelで開発を行う際、公式が提供する「Laravel Sail」は非常に便利ですが、内部のDocker設定が隠蔽されており、時にはカスタマイズが難しいと感じることもあります。

一方で、以前紹介したような素のNginxとPHP-FPMのDocker環境 では、Laravelの実行に必要なcomposer installartisanコマンドの実行、cronの設定などを別途行う必要があり、手間がかかります。

この記事では、あなたのPHPとDockerの知見を活かし、Sailを使わずに、Nginx, PHP-FPM, MySQLの各コンテナをdocker-compose.ymlで明示的に定義し、Laravelアプリケーションを動かすための、実践的でカスタマイズ性の高い開発環境を構築する手順をメモとしてまとめます。

なぜSailを使わないのか?

Laravel Sailは素晴らしいツールですが、以下のようなケースでは自前でdocker-compose.ymlを組むメリットがあります。

  • 学習のため: Dockerと各サービス(Nginx, PHP-FPM)がどのように連携しているかを深く理解したい。
  • カスタマイズ性: PHPのバージョンや拡張機能、Nginxの設定を、プロジェクト固有の要件に合わせて細かくチューニングしたい。
  • ミドルウェアの追加: Sailが標準サポートしていないミドルウェア(例: 特定バージョンのRedis, Meilisearchなど)を簡単に追加・管理したい。

構築する環境

この記事で構築する環境は以下の通りです。

  • Webサーバー: Nginx
  • アプリケーション: PHP-FPM (Laravel実行用)
  • データベース: MySQL (またはMariaDB)
  • 管理: Docker Compose

Step 1: プロジェクトのディレクトリ構成

まず、プロジェクトのディレクトリ構成を以下のように準備します。

my-laravel-app/
├── docker-compose.yml   # Docker Compose全体の設定
├── src/                 # Laravelアプリケーションのソースコード
└── docker/
    ├── nginx/
    │   └── default.conf # Nginxの設定ファイル
    └── php/
        ├── Dockerfile     # PHPコンテナの設計図
        └── php.ini      # PHPの設定ファイル

src/ディレクトリには、後でLaravelプロジェクトを作成(または既存のプロジェクトを配置)します。

Step 2: docker-compose.ymlの作成

Nginx, PHP-FPM, MySQLの3つのサービスを連携させるためのdocker-compose.ymlを作成します。

docker-compose.yml
version: '3.8'

services:
  # Nginx サービス
  nginx:
    image: nginx:latest
    ports:
      - "8000:80" # ホストの8000番ポートをコンテナの80番に
    volumes:
      - ./src:/var/www/html # Laravelのソースコードをマウント
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
      - db
    networks:
      - laravel-network

  # PHP-FPM サービス
  php:
    build:
      context: ./docker/php # docker/php/Dockerfile を使ってビルド
    volumes:
      - ./src:/var/www/html # ソースコードをマウント
    networks:
      - laravel-network

  # MySQL サービス
  db:
    image: mysql:8.0
    container_name: laravel-mysql
    ports:
      - "33060:3306" # ホストの33060番ポートをコンテナの3306番に
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - mysql-data:/var/lib/mysql # データを永続化
    networks:
      - laravel-network

networks:
  laravel-network:
    driver: bridge

volumes:
  mysql-data:
    driver: local

Step 3: PHP-FPMコンテナ (Dockerfile) の作成

Laravelの実行に必要なPHP拡張機能をインストールするためのDockerfileを作成します。

docker/php/dockerfile
FROM php:8.2-fpm

# 必要なライブラリをインストール
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    libzip-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install pdo_mysql zip gd mbstring exif pcntl

# Composer (PHPのパッケージ管理ツール) をインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# ワーキングディレクトリを設定
WORKDIR /var/www/html
  • pdo_mysql, mbstring, exifなどはLaravelの動作に必須の拡張機能です。
  • composerをコンテナに含めることで、docker compose execコマンドでcomposer installなどが実行できるようになります。

Step 4: Nginx設定ファイル (default.conf) の作成

NginxがLaravelのpublicディレクトリを正しく認識し、リクエストをPHP-FPMに渡すための設定です。

docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public; # Laravelの公開ディレクトリを指定
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000; # php サービスの9000番ポートへ
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}
  • 重要: root/var/www/html/publicに設定するのがLaravelのポイントです。

Step 5: 環境の起動とLaravelのインストール

すべての設定ファイルが揃ったら、環境を起動します。

1. Dockerコンテナの起動

docker compose up -d --build

--buildオプションで、docker/php/Dockerfileの変更を反映させます。

2. Laravelプロジェクトのインストール
(まだsrc/にLaravelがない場合)

# Dockerコンテナ内でComposerを使ってLaravelをインストール
docker compose exec php composer create-project --prefer-dist laravel/laravel .

(既にsrc/にLaravelがある場合)

# 依存パッケージのインストール
docker compose exec php composer install

# .envファイルの作成
docker compose exec php cp .env.example .env

# アプリケーションキーの生成
docker compose exec php php artisan key:generate

3. .envファイルの編集
src/.envファイルを開き、docker-compose.ymlで設定したデータベース情報に合わせます。

src/.env
DB_CONNECTION=mysql
DB_HOST=db             # コンテナ名 (laravel-mysql) ではなく、サービス名 (db) を指定
DB_PORT=3306           # コンテナ間の通信なのでホストのポート(33060)ではない
DB_DATABASE=laravel_db
DB_USER=laravel_user
DB_PASSWORD=password
  • 重要: DB_HOSTには、ホストPCの127.0.0.1localhostではなく、docker-compose.ymlで定義したサービス名 (db) を指定します。

4. マイグレーションの実行

docker compose exec php php artisan migrate

これで、ブラウザでhttp://localhost:8000にアクセスすると、Laravelのウェルカムページが表示されるはずです。

おわりに

Laravel Sailは手軽ですが、このようにdocker-compose.ymlを自前で書くことで、Dockerの仕組みを深く理解しながら、プロジェクトに最適化された柔軟な開発環境を構築できます。

docker compose exec php ...コマンドを使えば、php artisancomposerもコンテナ内で完結するため、ローカルPCにPHPやComposerをインストールする必要すらありません。

ぜひ、あなたのLaravelプロジェクトにも応用してみてください。


この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MEANTECH
https://meantech.fontfontfont.com/

Discussion