DockerでLaravel開発環境を構築する
ローカル開発環境のセットアップは、チームメンバーによって微妙に異なることが多く「自分のPCでは動くのに」という問題の原因になります。Dockerを使えば全員が同じ環境で開発でき、本番環境との差異も最小化できます。
Docker Composeの構成
# docker-compose.yml
version: '3.9'
services:
# Nginx(Webサーバー)
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
volumes:
- ./:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
# PHP-FPM
php:
build:
context: .
dockerfile: docker/php/Dockerfile
volumes:
- ./:/var/www/html
environment:
- APP_ENV=local
depends_on:
- postgres
- redis
# PostgreSQL
postgres:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_DB: laravel_db
POSTGRES_USER: laravel_user
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
- ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
# Redis(キュー・キャッシュ)
redis:
image: redis:7-alpine
ports:
- "6379:6379"
# Mailpit(メール確認)
mailpit:
image: axllent/mailpit
ports:
- "8025:8025" # Web UI
- "1025:1025" # SMTP
volumes:
postgres_data:
PHP Dockerfileの作成
# docker/php/Dockerfile
FROM php:8.2-fpm-alpine
# システムパッケージ
RUN apk add --no-cache \
git \
curl \
libpng-dev \
libjpeg-turbo-dev \
libwebp-dev \
freetype-dev \
libpq-dev \
libzip-dev \
unzip \
nodejs \
npm
# PHP拡張
RUN docker-php-ext-configure gd \
--with-freetype \
--with-jpeg \
--with-webp \
&& docker-php-ext-install \
pdo_pgsql \
pdo_mysql \
gd \
zip \
bcmath \
opcache \
exif \
pcntl
# Redis拡張
RUN pecl install redis \
&& docker-php-ext-enable redis
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# OPcache設定
COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
# ユーザー作成(ファイル権限問題を防ぐ)
RUN addgroup -g 1000 appuser && adduser -u 1000 -G appuser -s /bin/sh -D appuser
USER appuser
CMD ["php-fpm"]
Nginxの設定
# docker/nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php;
client_max_body_size 20M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
# 静的ファイルのキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
.envの設定
APP_URL=http://localhost
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret
REDIS_HOST=redis
REDIS_PORT=6379
QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
Makefile で操作を簡略化
# Makefile
up:
docker compose up -d
down:
docker compose down
build:
docker compose build --no-cache
bash:
docker compose exec php sh
artisan:
docker compose exec php php artisan $(cmd)
composer:
docker compose exec php composer $(cmd)
npm:
docker compose exec php npm $(args)
fresh:
docker compose exec php php artisan migrate:fresh --seed
test:
docker compose exec php php artisan test --parallel
# 使い方
make up # 起動
make artisan cmd="migrate" # マイグレーション
make artisan cmd="queue:work" # キューワーカー
make artisan cmd="tinker" # Tinker
make composer cmd="require laravel/sanctum" # Composer
本番環境との差異を最小化する
# docker-compose.prod.yml(本番用オーバーライド)
services:
php:
environment:
APP_ENV: production
APP_DEBUG: "false"
deploy:
resources:
limits:
memory: 512M
まとめ
DockerでLaravel開発環境を構築することで、チーム全員が同じ環境で開発でき、「自分のPCでは動く」問題を防げます。弊社ではDocker + GitHub Actions(CI/CD)+ レンタルサーバーというスタックで安定した開発・デプロイフローを実現しています。
インフラ構成・開発環境のご相談もお気軽にどうぞ。