🙄
Laravel 12 + PHP 8.2 + Nginx + Dockerで開発環境構築 (2025年版)
はじめに
Laravel 12 と PHP 8.2 を使った開発環境を Docker で構築した手順を備忘録としてまとめます。Nginx + PHP-FPM の構成で、GitHub Actions を使った CI 実行も対応しています。
こちらのブログを参考とさせていただき、laravel12で構築しました。
環境構成
- 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 /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のところを変更。
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