PHP備忘録：Laravel + MySQL + phpMyAdmin を Docker で構築してみた記録

## はじめに

この記事では、PHPのキャッチアップを目指す初学者が、Laravel + MySQL + phpMyAdmin + Composer を使った本格的なアプリ開発に挑戦するためのDocker環境構築手順を記録として残しています。

**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**

## 書こうと思ったきっかけ

個人的にPHPのキャッチアップをしたくて、勉強している初学者による備忘録としてまとめました。
Laravelの実践的な環境構築を通じて、PHPの開発スキルを深めていくのが目的です。

## 内容

### ディレクトリ構成（初期）

```
laravel-docker/
├── docker-compose.yml
├── Dockerfile
├── Makefile
└── src/            ← Laravelアプリが入る場所
```

### Dockerfile

```Dockerfile
# PHP 8.2 + Apache の公式イメージをベースにする
FROM php:8.2-apache

# Laravelで必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    zip unzip git curl libzip-dev libonig-dev \
    && docker-php-ext-install pdo_mysql zip

# Composer（PHPのパッケージ管理ツール）をインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# LaravelのpublicフォルダをApacheのルートに設定
RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf

# 作業ディレクトリをApacheのルートに設定
WORKDIR /var/www/html

# Laravelアプリのソースコードをコピー（最初は空でもOK）
COPY src/ /var/www/html/
```

### docker-compose.yml

```yaml
version: '3.8'

services:
  # Laravelアプリケーションを動かすコンテナ
  app:
    build: .  # Dockerfile を使ってビルド
    ports:
      - "8080:80"  # ホストの8080番 → コンテナの80番（Apache）
    volumes:
      - ./src:/var/www/html  # ローカルのsrcをコンテナ内のLaravelディレクトリにマウント
    depends_on:
      - db  # dbサービスが先に起動している必要がある

  # MySQL データベースサーバ
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root     # rootユーザーのパスワード
      MYSQL_DATABASE: laravel       # 自動的に作成するデータベース名
      MYSQL_USER: laravel           # アプリ用のユーザー名
      MYSQL_PASSWORD: secret        # アプリ用ユーザーのパスワード
    volumes:
      - db-data:/var/lib/mysql  # データを永続化
    ports:
      - "3306:3306"  # 必要ならローカルからDB接続できるようにする

  # phpMyAdmin（MySQLのGUI管理ツール）
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8081:80"  # ブラウザから http://localhost:8081 でアクセス可能
    environment:
      PMA_HOST: db  # 接続するMySQLホスト名
      MYSQL_ROOT_PASSWORD: root

# ボリューム定義（データ永続化）
volumes:
  db-data:
```

### Makefile

```Makefile
.PHONY: start stop build init-laravel

# コンテナをビルドして起動（リアルタイムログ付き）
start:
	docker compose up --build

# コンテナをすべて停止・削除
stop:
	docker compose down

# コンテナの再ビルド
build:
	docker compose build

# Laravelアプリを初期化（src フォルダにプロジェクトを作成）
init-laravel:
	docker compose run --rm app composer create-project laravel/laravel .
```

### Laravelプロジェクト作成手順

```bash
cd laravel-docker
make init-laravel  # src に Laravel プロジェクトが作成される
make start         # コンテナを起動（ビルド付き）
```

### 動作確認URL

| サービス       | URL                                            |
| ---------- | ---------------------------------------------- |
| Laravel    | [http://localhost:8080](http://localhost:8080) |
| phpMyAdmin | [http://localhost:8081](http://localhost:8081) |

**実際の画面**

![Screenshot 2025-05-03 at 17.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/be58c19e-4f7f-4c78-b651-3e63a22f5b5b.png)

![Screenshot 2025-05-03 at 17.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2351f56d-2072-4f26-a41d-ef33667b874d.png)


## まとめ

この構成により、Laravelを用いた実践的なPHPアプリ開発をDocker上で体験できます。

:::note alert
Forbidden エラーが出る場合は、Apacheのルート設定を `public/` に変更することで解決しました（2025/05/03）。
:::

しばらくの間、PHP に関する記事の投稿が増えるかと思いますが、どうぞよろしくお願いいたします。