Laravel Sailはもう古い?DockerでモダンなLaravel開発環境を構築する手順
はじめに
Laravelで開発を行う際、公式が提供する「Laravel Sail」は非常に便利ですが、内部のDocker設定が隠蔽されており、時にはカスタマイズが難しいと感じることもあります。
一方で、以前紹介したような素のNginxとPHP-FPMのDocker環境 では、Laravelの実行に必要なcomposer installやartisanコマンドの実行、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を作成します。
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を作成します。
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 /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に渡すための設定です。
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で設定したデータベース情報に合わせます。
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.1やlocalhostではなく、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 artisanやcomposerもコンテナ内で完結するため、ローカルPCにPHPやComposerをインストールする必要すらありません。
ぜひ、あなたのLaravelプロジェクトにも応用してみてください。
この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MEANTECH
Discussion