技術系TIPS
PR

【2026年版】AWS をやめてローカル Docker へ!Laravel 11 + MySQL 8.4 の開発環境を構築する完全ガイド

saratogax
記事内に商品プロモーションを含む場合があります

個人開発の管理ツールを AWS(EC2 + RDS)で運用していましたが、コストや運用の手間を考慮し、ローカルの Docker 環境に移行することにしました。

この記事では、Windows 環境に Docker Desktop をインストールし、Laravel 11 + MySQL 8.4 + nginx の開発環境を docker-compose で構築する手順を解説します。

この記事で構築する環境

項目バージョン
PHP8.3
Laravel11
MySQL8.4(LTS)
Web サーバーnginx
環境Docker Compose
※表は横スクロールできます

対象読者

  • AWS の運用コストを削減したい方
  • ローカルで完結する開発環境を構築したい方
  • Docker で Laravel 環境を構築したい方
  • Windows で PHP 開発環境を整えたい方

なぜ AWS をやめてローカル Docker にしたのか

AWS 運用時の課題

従来は以下の構成で管理ツールを運用していました。

  • EC2(t3.micro): PHP 5.6 + CodeIgniter 2
  • RDS(MySQL 8.0)
  • nginx + php-fpm

この構成には以下の課題がありました。

  1. コスト: 無料枠終了後、月額 $30〜50 程度の費用が発生
  2. 運用の手間: EC2 のセキュリティパッチ適用、監視など
  3. 古い技術スタック: PHP 5.6 + CodeIgniter 2 のリプレースが必要

ローカル Docker のメリット

管理ツールは「自分だけが使う」用途だったため、以下の理由でローカル Docker への移行を決めました。

比較項目AWS (EC2 + RDS)ローカル Docker
コスト無料枠後 $30-50/月$0
外部アクセス✅ 可能❌ 基本不可
常時稼働✅ 24時間PC 起動時のみ
運用の手間サーバー管理必要ほぼ不要
デプロイCI/CD 設定必要不要(直接編集)
※表は横スクロールできます

自分専用のツールであれば、ローカル Docker で十分という結論に至りました。

事前準備:CPU アーキテクチャの確認

Docker Desktop をダウンロードする前に、PC の CPU アーキテクチャを確認します。PowerShell で以下のコマンドを実行してください。

echo $env:PROCESSOR_ARCHITECTURE
  • AMD64 → Intel / AMD 製 CPU(一般的な Windows PC)
  • ARM64 → ARM 製 CPU(Surface Pro X など)

ほとんどの Windows PC は AMD64 です。

Docker Desktop のインストール

ダウンロード

以下の公式サイトから Docker Desktop をダウンロードします。

先ほど確認した CPU アーキテクチャに合わせて選択してください。

インストール手順

  1. ダウンロードしたインストーラーを実行
  2. 「Use WSL 2 instead of Hyper-V」にチェック(推奨)
  3. インストール完了後、PC を再起動

ライセンス同意

再起動後、Docker Desktop を起動すると「Docker Subscription Service Agreement」が表示されます。

  • 個人利用・学習目的 → 無料(Personal プラン)
  • 小規模企業(250人未満 かつ 年商$10M未満) → 無料
  • 大企業 → 有料プランが必要

個人開発であれば「Accept」をクリックして問題ありません。

動作確認

PowerShell で以下のコマンドを実行し、インストールを確認します。

docker --version

docker compose version

以下のように表示されれば OK です。

Docker version 29.1.3, build f52814d

Docker Compose version v2.40.3-desktop.1

プロジェクトのディレクトリ構成

以下の構成でプロジェクトを作成します。

admin-v2/
├── docker/
│   ├── php/
│   │   └── Dockerfile
│   ├── nginx/
│   │   └── default.conf
│   └── mysql/
│       └── init/
├── src/                    ← Laravel プロジェクト
├── docker-compose.yml
├── .gitignore
└── README.md

各設定ファイルの作成

docker-compose.yml

プロジェクトのルートに docker-compose.yml を作成します。
(パスワードなどの機密情報はダミー値なので、参考にする場合は置き換えてください)

services:
  # PHP-FPM + Laravel
  app:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: admin-v2-app
    restart: unless-stopped
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - db
    networks:
      - admin-network

  # Nginx
  web:
    image: nginx:alpine
    container_name: admin-v2-web
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - admin-network

  # MySQL 8.4 (LTS)
  db:
    image: mysql:8.4
    container_name: admin-v2-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: admin_v2
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - admin-network

  # phpMyAdmin
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: admin-v2-pma
    restart: unless-stopped
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root
    depends_on:
      - db
    networks:
      - admin-network

networks:
  admin-network:
    driver: bridge

volumes:
  db_data:

docker/php/Dockerfile

PHP 8.3 + 必要な拡張機能をインストールする Dockerfile です。

FROM php:8.3-fpm-alpine

# 必要なパッケージをインストール
RUN apk add --no-cache \
    git \
    curl \
    zip \
    unzip \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    oniguruma-dev \
    libxml2-dev \
    icu-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) \
        pdo \
        pdo_mysql \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        intl \
        opcache

# Composer インストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# OPcache 設定
RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.interned_strings_buffer=8" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.validate_timestamps=1" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.revalidate_freq=2" >> /usr/local/etc/php/conf.d/opcache.ini

# PHP 設定
RUN echo "upload_max_filesize=64M" >> /usr/local/etc/php/conf.d/uploads.ini \
    && echo "post_max_size=64M" >> /usr/local/etc/php/conf.d/uploads.ini \
    && echo "memory_limit=256M" >> /usr/local/etc/php/conf.d/memory.ini

WORKDIR /var/www/html

RUN addgroup -g 1000 laravel && adduser -u 1000 -G laravel -s /bin/sh -D laravel
USER laravel

EXPOSE 9000
CMD ["php-fpm"]

docker/nginx/default.conf

nginx の設定ファイルです。

server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    client_max_body_size 64M;

    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_read_timeout 300;
        fastcgi_send_timeout 300;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

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

.gitignore

# Laravel
/src/vendor/
/src/node_modules/
/src/.env
/src/storage/*.key
/src/storage/logs/*
!/src/storage/logs/.gitkeep

# IDE
.idea/
.vscode/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Docker
docker/mysql/data/

# Logs
*.log

Docker コンテナの起動

設定ファイルを作成したら、コンテナをビルドして起動します。

cd C:\work\workspace\admin-v2

docker compose up -d --build

初回はイメージのダウンロードとビルドに数分かかります。

起動状態を確認します。

docker compose ps

以下のように 4 つのコンテナが Up になっていれば OK です。

NAME           IMAGE               STATUS          PORTS
admin-v2-app   admin-v2-app        Up              9000/tcp
admin-v2-db    mysql:8.4           Up              0.0.0.0:3306->3306/tcp
admin-v2-pma   phpmyadmin:latest   Up              0.0.0.0:8081->80/tcp
admin-v2-web   nginx:alpine        Up              0.0.0.0:8080->80/tcp

Laravel プロジェクトの作成

コンテナが起動したら、app コンテナ内で Laravel プロジェクトを作成します。

docker compose exec app composer create-project laravel/laravel .

データベース接続設定

Laravel の .env ファイルを編集して、MySQL に接続できるようにします。

docker compose exec app sh -c "sed -i 's/DB_CONNECTION=sqlite/DB_CONNECTION=mysql/' .env && sed -i 's/# DB_HOST=127.0.0.1/DB_HOST=db/' .env && sed -i 's/# DB_PORT=3306/DB_PORT=3306/' .env && sed -i 's/# DB_DATABASE=laravel/DB_DATABASE=admin_v2/' .env && sed -i 's/# DB_USERNAME=root/DB_USERNAME=laravel/' .env && sed -i 's/# DB_PASSWORD=/DB_PASSWORD=secret/' .env"

設定キャッシュをクリアして、マイグレーションを実行します。

docker compose exec app php artisan config:clear

docker compose exec app php artisan migrate

動作確認

ブラウザで以下の URL にアクセスします。

URL内容
http://localhost:8080Laravel アプリ
http://localhost:8081phpMyAdmin
※表は横スクロールできます

Laravel のウェルカムページが表示されれば、環境構築は完了です!

phpMyAdmin ログイン情報

  • ユーザー名: root
  • パスワード: root

または

  • ユーザー名: laravel
  • パスワード: secret
  • データベース: admin_v2

よく使うコマンド集

開発中によく使うコマンドをまとめておきます。

# コンテナ起動
docker compose up -d

# コンテナ停止
docker compose down

# ログ確認
docker compose logs -f

# app コンテナに入る
docker compose exec app sh

# Artisan コマンド
docker compose exec app php artisan migrate
docker compose exec app php artisan make:controller XxxController
docker compose exec app php artisan make:model Xxx -m

# Composer
docker compose exec app composer install
docker compose exec app composer require パッケージ名

# キャッシュクリア
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:clear
docker compose exec app php artisan view:clear

# データベースバックアップ
docker compose exec db mysqldump -u root -proot admin_v2 > backup.sql

まとめ

この記事では、AWS(EC2 + RDS)からローカル Docker 環境への移行手順を解説しました。

構築した環境

  • Laravel 11 + PHP 8.3
  • MySQL 8.4(LTS:2032年までサポート)
  • nginx + phpMyAdmin
  • Docker Compose で一括管理

ローカル Docker 環境のメリット

  1. コストゼロ – AWS の月額費用が不要
  2. 運用の手間なし – サーバー管理から解放
  3. 環境の再現性 – docker-compose.yml があればどこでも同じ環境
  4. 高速な開発 – デプロイ不要で即座に反映

個人開発や学習用途であれば、ローカル Docker 環境は非常におすすめです。

外部公開が必要になった場合は、ngrok や Cloudflare Tunnel を使って一時的に公開することも可能です。

ぜひ、この記事を参考に Docker 環境を構築してみてください!

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました