Yii2

DockerでYii2開発環境を最短構築!初心者でもできるMySQL・phpMyAdmin・Mailpit連携ガイド

この記事は約15分で読めます。
スポンサーリンク

本記事では、Windows環境で Yii2(Basicテンプレート) を用いたPHPアプリ開発用に、MySQLphpMyAdmin、そしてテスト用SMTPサーバ Mailpit(メール受信UI付き)を Docker で一気に構築する手順を解説します。プロジェクトのルートは次のパスに固定します。

ルートC:\Work\Workspace\Docker\example.com
フレームワーク本体C:\Work\Workspace\Docker\example.com\htdocs
ドキュメントルート C:\Work\Workspace\Docker\example.com\htdocs\web
Webアクセス http://localhost:8080
phpMyAdminhttp://localhost:8081

この記事は 「そのままコピペで動く」 を重視しています。

スポンサーリンク

事前準備とディレクトリ構成

以下のフォルダを作成します。

C:\Work\Workspace\Docker\example.com\
├─ htdocs\ ← Yii2のアプリ本体が入る(後で自動生成)
├─ docker\
│ ├─ php\
│ │ ├─ Dockerfile
│ │ └─ php.ini
│ └─ nginx\
│ └─ default.conf
└─ docker-compose.yml

docker-compose.yml の作成

ファイル: C:\Work\Workspace\Docker\example.com\docker-compose.yml

services:
  nginx:
    image: nginx:1.27-alpine
    container_name: example_nginx
    ports:
      - "8080:80" # Web → http://localhost:8080
    volumes:
      - ./htdocs:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    networks:
      - appnet

  php:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: example_php
    volumes:
      - ./htdocs:/var/www/html
    environment:
      PHP_MEMORY_LIMIT: 512M
      PHP_MAX_EXECUTION_TIME: 120
    networks:
      - appnet
  db:
    image: mysql:8.0
    container_name: example_db
    command: ["mysqld", "--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_0900_ai_ci"]
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: example
      MYSQL_USER: app
      MYSQL_PASSWORD: apppass
      TZ: Asia/Tokyo
    ports:
      - "3307:3306" # ローカルMySQLと衝突回避したい場合は3307→3306
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - appnet

  phpmyadmin:
    image: phpmyadmin:5-apache
    container_name: example_pma
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - "8081:80" # phpMyAdmin → http://localhost:8081
    depends_on:
      - db
    networks:
      - appnet

  mailpit:
    image: axllent/mailpit:latest
    container_name: example_mailpit
    ports:
      - "1025:1025" # SMTP (アプリからの送信先)
      - "8025:8025" # Web UI → http://localhost:8025
    networks:
      - appnet

volumes:
  dbdata:

networks:
  appnet:
    driver: bridge
補足

既存でMySQLがWindowsに入っている場合、ports"3307:3306" のように ホスト側を3307 にすると衝突しません。

PHP(php-fpm)用 Dockerfile と設定

ファイル: C:\Work\Workspace\Docker\example.com\docker\php\Dockerfile

FROM php:8.3-fpm-alpine

# 必要拡張の導入
RUN apk add --no-cache \
    git zip unzip icu-dev oniguruma-dev libpng-dev libjpeg-turbo-dev libwebp-dev libzip-dev autoconf build-base \
 && docker-php-ext-configure gd --with-jpeg --with-webp \
 && docker-php-ext-install -j$(nproc) pdo_mysql intl mbstring gd zip exif bcmath opcache

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

Nginx の設定

ファイル: C:\Work\Workspace\Docker\example.com\docker\nginx\default.conf

server {
  listen 80;
  server_name example.com localhost;

  root /var/www/html/web;
  index index.php index.html;

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

  location ~ \.php$ {
    include       fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php:9000;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
  }

  location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?|ttf)$ {
    expires 7d;
    add_header Cache-Control "public";
  }
}

php.ini の最低限の調整

ファイル: C:\Work\Workspace\Docker\example.com\docker\php\php.ini

memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME}
upload_max_filesize = 32M
post_max_size = 32M
date.timezone = Asia/Tokyo

コンテナの起動と初期化

PowerShell で次を実行します。

cd C:\Work\Workspace\Docker\example.com
# 初回ビルド&起動
docker compose up -d --build

# 状態確認
docker compose ps
  • http://localhost:8080 → Nginx(Yii2はまだ未導入なので404/エラー想定)
  • http://localhost:8081 → phpMyAdmin(root / root、サーバ: db でログイン可)
  • http://localhost:8025 → Mailpit(受信ボックスUI)

Yii2 のインストール(コンテナ内でComposer実行)

htdocs に Yii2 Basic を展開します。

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

# コンテナ内で実行(/var/www/html)
composer create-project yiisoft/yii2-app-basic .
exit

作成後、Windows側では C:\Work\Workspace\Docker\example.com\htdocs にファイルが展開されます。Nginx の root/web 配下なので、web/index.php が入口になります。

DB接続設定(.env と Yii2設定)

Yii2 Basic はデフォルトで .env はありませんが、設定を分けたい場合は導入も可能です。ここではシンプルに config/db.php を直接編集します。

ファイル: htdocs\config\db.php

<?php
return [
  'class' => 'yii\db\Connection',
  'dsn' => 'mysql:host=db;port=3306;dbname=example',
  'username' => 'app',
  'password' => 'apppass',
  'charset' => 'utf8mb4',
  'attributes' => [
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_STRINGIFY_FETCHES => false,
  ],
];

hostdb(docker-compose のサービス名)を指定します。ホストOSから直接接続する場合は localhost:3307 です。

初期テーブルを作る例として、マイグレーションを1本作ってみます(任意)。

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

# マイグレーション作成
php yii migrate/create create_post_table

# 生成されたファイル(例: migrations/mYYYYMMDD_HHMMSS_create_post_table.php)を編集
exit

サンプル(生成ファイルを編集)

public function safeUp()
{
  $this->createTable('{{%post}}', [
    'id' => $this->primaryKey(),
    'title' => $this->string()->notNull(),
    'body' => $this->text(),
    'created_at' => $this->dateTime()->defaultExpression('CURRENT_TIMESTAMP'),
  ]);
}


public function safeDown()
{
  $this->dropTable('{{%post}}');
}
# もう一度入って実行
docker compose exec php sh
php yii migrate --interactive=0
exit

Mailpit(メール送信テスト)設定

開発中のメールは 本当に送らない のが安全です。Mailpit に流してUIで確認しましょう。

ファイル: htdocs\config\web.phpcomponentsmailer を追記)

'components' => [
  // ... 既存設定 ...
  'mailer' => [
    'class' => 'yii\swiftmailer\Mailer',
    'useFileTransport' => false, // falseでSMTPへ送信
    'transport' => [
      'class' => 'Swift_SmtpTransport',
      'host' => 'mailpit',
      'port' => 1025,
      'encryption' => null,
    ],
  ],
],

もし Yii2 を yiisoft/mailer に置き換える場合は適宜設定を読み替えてください(SwiftMailerは非推奨化済みですが、Yii2 Basic既定の形のままでもMailpit連携は可能です)。

テスト送信例(コントローラやコンソールから)

Yii::$app->mailer->compose()
         ->setFrom('no-reply@example.com')
         ->setTo('test@example.com')
         ->setSubject('Mailpit送信テスト')
         ->setTextBody('これはテスト本文です')
         ->send();

http://localhost:8025 を開くと、受信メールが一覧表示されます。

動作確認(Web・DB・Mail)

  1. Web
    http://localhost:8080 にアクセスして Yii2 のトップが表示されること。
  2. DB
    http://localhost:8081 → phpMyAdmin に root/root でログイン。example データベースに post テーブルができていること。
  3. Mail
    サンプルコードを実行し、http://localhost:8025 の受信箱にメールが入ること。

トラブルシューティング

ポート競合

8080/8081/8025/1025/3307 が使用中 → docker-compose.ymlports 左側(ホスト側)を変更。

MySQLへ接続できない

  • hostdb(Docker内部)か、ホスト接続では localhost:3307 を指定。
  • 初回起動直後はDBの立ち上がり待ちが必要。数秒待って再試行。

Windows で権限由来の書き込みエラー

htdocs/runtimehtdocs/web/assets の書き込み権限が必要。コンテナ側で chmod -R 777 runtime web/assets(開発用途限定)。

ファイルの改行コード

Nginxやシェル用ファイルは LF を推奨。VS Codeで LF へ変換。

古いコンテナやイメージの削除でエラー

例: Error response from daemon: conflict: unable to delete ... image is being used by stopped container ...

docker ps -a # 停止中を含め一覧
docker rm <CONTAINER_ID> # 停止中コンテナを削除
docker rmi <IMAGE_ID> # 参照がなくなったらイメージ削除
# 一括停止・削除(このプロジェクト内)
docker compose down -v # コンテナ・ネットワーク・ボリューム削除
docker system prune -f # 不要なリソース掃除

Composerが遅い/タイムアウト

一時的に -vvv で状況確認。社内プロキシ下では環境変数の設定を。

よく使うコマンド集

# 起動・ビルド
cd C:\Work\Workspace\Docker\example.com
docker compose up -d --build

# 停止
docker compose down

# 停止+ボリュームごと削除(DB初期化したいとき)
docker compose down -v

# ログ参照
docker compose logs -f nginx
docker compose logs -f php
docker compose logs -f db

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

# 権限(開発用)
docker compose exec php sh -c "chmod -R 777 runtime web/assets"

あとがき

ここまでで、Windows + Docker 上に Yii2 + MySQL + phpMyAdmin + Mailpit の開発環境が整いました。実運用では Mailpit の代わりに本番SMTPを使いますが、開発段階では誤送信防止のため Mailpit固定 を強くおすすめします。また、MySQLのパスワードや公開ポートは本番用に必ず見直してください。必要に応じて SSLXdebug の導入、Nginxのキャッシュ/セキュリティヘッダ の調整などを行うと、より快適で安全な環境になります。

引用元

スポンサーリンク
Yii2ウェブ・開発
フォローしてね
スポンサーリンク

コメント

タイトルとURLをコピーしました