本記事では、Windows環境で Yii2(Basicテンプレート) を用いたPHPアプリ開発用に、MySQL、phpMyAdmin、そしてテスト用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 |
phpMyAdmin | http://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,
],
];
host
はdb
(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.php
(components
に mailer
を追記)
'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)
- Web
http://localhost:8080
にアクセスして Yii2 のトップが表示されること。 - DB
http://localhost:8081
→ phpMyAdmin にroot/root
でログイン。example
データベースにpost
テーブルができていること。 - Mail
サンプルコードを実行し、http://localhost:8025
の受信箱にメールが入ること。
トラブルシューティング
ポート競合
8080
/8081
/8025
/1025
/3307
が使用中 → docker-compose.yml
の ports
左側(ホスト側)を変更。
MySQLへ接続できない
host
はdb
(Docker内部)か、ホスト接続ではlocalhost:3307
を指定。- 初回起動直後はDBの立ち上がり待ちが必要。数秒待って再試行。
Windows で権限由来の書き込みエラー
htdocs/runtime
と htdocs/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のパスワードや公開ポートは本番用に必ず見直してください。必要に応じて SSL や Xdebug の導入、Nginxのキャッシュ/セキュリティヘッダ の調整などを行うと、より快適で安全な環境になります。
引用元
- Yii Framework 公式ドキュメント(Yii2 Basicテンプレート)
https://www.yiiframework.com/doc/guide/2.0/ja - Docker 公式ドキュメント
https://docs.docker.com/ - Docker Compose 公式ドキュメント
https://docs.docker.com/compose/ - MySQL 公式ドキュメント
https://dev.mysql.com/doc/ - phpMyAdmin 公式サイト
https://www.phpmyadmin.net/ - Mailpit(開発用SMTP & Web UIツール)公式リポジトリ
https://github.com/axllent/mailpit - Nginx 公式ドキュメント
https://nginx.org/en/docs/ - PHP 公式マニュアル(Docker Hub版)
https://hub.docker.com/_/php - Composer 公式サイト
https://getcomposer.org/
コメント