🙄

Laravel 12 + PHP 8.2 + Nginx + Dockerで開発環境構築 (2025年版)

に公開

はじめに

Laravel 12 と PHP 8.2 を使った開発環境を Docker で構築した手順を備忘録としてまとめます。Nginx + PHP-FPM の構成で、GitHub Actions を使った CI 実行も対応しています。

こちらのブログを参考とさせていただき、laravel12で構築しました。
https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4


環境構成

  • Laravel 12
  • PHP 8.2 (FPM)
  • Nginx
  • MySQL 8.0
  • Docker / Docker Compose
  • GitHub Actions (CI)

ディレクトリ構成

laravel-docker/
├── docker-compose.yml
├── infra/
│   ├── php/
│   │   ├── Dockerfile
│   │   └── php.ini
│   ├── nginx/
│   │   └── default.conf
│   └── mysql/
│       └── Dockerfile (optional)
└── src/  # Laravel本体

docker-compose.yml

services:
  app:
    build: ./infra/php
    volumes:
      - ./src:/data

  web:
    image: nginx:1.20-alpine
    ports:
      - 8080:80
    volumes:
      - ./src:/data
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /data

  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - 3306:3306

volumes:
  db-store:
  • ローカルでsequel aceなどでmysqlで接続する際にポート番号が必要のため3306を設定
ports:
      - 3306:3306

infra/php/Dockerfile

FROM php:8.2-fpm-bullseye

ENV COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
  apt-get -y install --no-install-recommends git unzip libzip-dev libicu-dev libonig-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /data

infra/php/php.ini

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese


infra/nginx/default.conf

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /data/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

こちらのサイトを参考に、rootとlocationのところを変更。
https://readouble.com/laravel/12.x/ja/deployment.html?header=Nginx



infra/mysql/Dockerfile

FROM mysql/mysql-server:8.0

ENV MYSQL_DATABASE=laravel \
  MYSQL_USER=phper \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret \
  TZ=Asia/Tokyo

COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf

infra/mysql/my.cnf

[mysqld]
# default
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
secure-file-priv = /var/lib/mysql-files
user = mysql

pid-file = /var/run/mysqld/mysqld.pid

# character set / collation
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs_ks

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4


Laravel のインストール

# src は空にしておく
mkdir -p src

docker compose run --rm app composer create-project laravel/laravel . "^12.0"

src/.envの更新

# src は空にしておく
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=phper
DB_PASSWORD=secret

.env.exampleも同様に更新する。
CI用の.envとする。


起動

docker compose up -d

http://localhost:8080」 にアクセスして Laravel 12の 画面が表示されれば OK!


GitHub Actions のCI設定

.github/workflows/test.yml

name: Laravel Testing

on:
  pull_request:

jobs:
  laravel-testing:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Docker Version
        run: docker version

      - name: Build Docker Image
        run: docker compose build

      - name: Start Docker Containers
        run: docker compose up -d

      - name: Wait for DB
        run: |
          for i in {1..30}; do
            docker compose exec -T app php -r 'try { new PDO("mysql:host=db;dbname=laravel", "phper", "secret"); exit(0); } catch (Exception $e) { echo "Waiting for DB...\n"; sleep(2); }'
          done

      - name: Setup Laravel
        run: |
          docker compose exec -T app cp .env.example .env
          docker compose exec -T app php artisan config:clear
          docker compose exec -T app php artisan key:generate
          docker compose exec -T app composer install

      - name: Migrate & Test
        run: |
          docker compose exec -T app php artisan migrate
          docker compose exec -T app php artisan test

DB connection refusedのエラーが出ることがあったので、キャッシュクリアのコマンドを追加。

php artisan config:clear

おわりに

最新のLaravel 12 の開発を始めるにあたって、Docker を利用して手軽に環境構築ができるようになりました。自分用の備忘録としても、同じ構成で開発したい人にとっても参考になれば幸いです!

Discussion