株式会社WR

株式会社WR

WEB TOTAL CONSULTING

DockerでLaravelの開発環境を構築——PHP・PostgreSQL・Nginxの設定
ブログ一覧へ
技術ブログ

DockerでLaravelの開発環境を構築——PHP・PostgreSQL・Nginxの設定

Dockerを使ってLaravel + PostgreSQL + Nginxの開発環境を構築します。チームメンバー全員が同じ環境で開発できるdocker-compose.ymlの書き方を解説します。

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)+ レンタルサーバーというスタックで安定した開発・デプロイフローを実現しています。

インフラ構成・開発環境のご相談もお気軽にどうぞ。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →