Dockerで作成したlocal開発環境が重い...。
そんな悩みを抱えている方におすすめの設定をご紹介します。
私も重いDocker環境に悩んでいましたが、下記変更を行ったことによりかなり改善されました。
環境によるところはありますが、4つのうち一部のみの変更でもだいぶ変化がみられると思います。
気になった方はぜひ取り入れてみてください!
1. PHP OPcache の最適化
有効化と開発用設定
php.iniでopcache.enable=1にし、OPcacheを有効にします。開発環境ではopcache.validate_timestamps=1(変更検知有効)にし、opcache.revalidate_freqを小さな値(例: 2秒)に設定すると、ファイル変更がすぐ反映されます。
PHP8以降のデフォルトでも revalidate_freq=2、enable_cli=0 となっており、開発向けに適した設定です。
設定例
開発用のphp.ini例は次のようになります(必要に応じて調整してください)。
opcache.enable=1
opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
効果
OPcacheでPHPコードの再コンパイルを減らせるため、ページ読み込み速度が数倍向上します。さらに、変更は設定した間隔内で自動検知されるので(例: 2秒以内)再起動不要で反映されます。
注意点
- 開発時は
validate_timestamps=1(変更検知有効)を使用してください。これを0にするとコード変更が反映されるのはPHPの再起動後になるため、開発では推奨されません。 - CLI(コマンド実行)でもキャッシュが残るとテストに影響する場合があるので、
opcache.enable_cli=0にするのも効果的です。
2. ファイル同期の最適化 (Windows/WSL2 向け)
WSL2 の活用
Windows上ではプロジェクトをWSL2(Linux環境)内に配置し、Windows側のファイルシステム(例: C:\)からは避けてください。
Docker公式も「プロジェクトファイルはWSL2内に置き、Windowsホスト上のファイルへのアクセスは可能な限り避ける」と推奨しています。
こうすると、WSL2とDockerが同じ仮想マシン内で動作するため、ファイルマウントのパフォーマンスが劇的に改善します。
ボリュームマウントの工夫
docker-compose.ymlでボリュームを設定する際、ホストと同期するディレクトリを工夫します。一般的にはプロジェクト全体(例: .:/var/www/html)をマウントしつつ、var/cacheやvendor(依存ファイル)など変更頻度が高い・容量が大きいフォルダだけを名前付きボリュームに切り出します。
例えば下記のように設定します:
services:
web:
volumes:
- .:/var/www/html
- cache:/var/www/html/var/cache
- vendor:/var/www/html/vendor
- node_modules:/var/www/html/node_modules
volumes:
cache:
vendor:
node_modules:
これにより、IDEによる補完等は有効なまま、var/cache、vendor(Composer依存関係)、node_modulesのI/Oをコンテナ内に留めて高速化できます。
Tips: vendorディレクトリは大量のファイルを含むため、名前付きボリュームに分離することで、Composer installやautoloadの読み込みが高速化されます。
効果
WSL2内でプロジェクトを配置し、ボリューム設定を最適化することで、ファイルアクセス速度が大幅に向上します。ファイル編集の反映もほぼ即時(数秒以下)となり、体感上のレスポンスが劇的に良くなります。
3. MySQL 設定の軽量化
メモリ抑制
開発環境では大量のメモリは不要なので、innodb_buffer_pool_sizeを小さめ(例: 256M)に設定し、max_connectionsも適切に下げておきます。これにより、コンテナ起動時のメモリ使用量を大幅に削減できます。
不要機能の無効化
開発時はデータの完全性より速度を優先するため、バイナリログ(--skip-log-bin)やクエリログ(--general-log=0)など不要な機能はOFFにします。
設定例
# my.cnf または docker-compose.yml の command セクション
[mysqld]
innodb_buffer_pool_size=256M
max_connections=50
skip-log-bin
general-log=0
注意点
既存データがある環境でinnodb_log_file_sizeなどを変更するとデータ互換性の問題が起こることがあります。データベース設定変更時は必ずバックアップを取るか、新規環境で検証してから適用してください。
4. 開発環境向けDocker Compose設定
不要サービスの排除
開発ではBlackfireやNew Relic、Mailhogなどすべてを常時起動する必要はありません。
プロファイリングやメール機能検証が必要なときだけ起動するように切り分けると、常時起動数が減って起動時間・メモリ消費ともに改善します。
Composeファイルの分割・上書き
本番用のdocker-compose.ymlと開発用の設定を分けます。
Docker Composeではデフォルトでdocker-compose.override.ymlを自動で読み込むため、開発用設定(環境変数の追加、ポート公開、ボリュームマウント設定など)をoverrideファイルに記述できます。
これによって本番向け設定を壊さず、開発時だけ有効にしたいオプションを簡単に管理できます。
実装手順(概要)
-
WSL2内にプロジェクト配置: Windows上のプロジェクトをWSL2にコピーまたはクローンし、WSL2のターミナルで作業します。
-
PHP設定の更新:
docker/php.iniなどにOPcache設定を追加します。コンテナ起動時にこれらの設定が読み込まれるようにDockerfileでコピーするなどして反映させます。 -
Compose設定の用意: 開発用に
docker-compose.override.ymlなどを作り、環境変数・ボリューム設定・ポート公開を追加します(例: キャッシュボリュームの定義やAPP_ENV=developmentの設定など)。 -
コンテナ起動・検証: 既存のコンテナを停止(
docker compose down)した後、最適化した設定でdocker compose up -dを実行し、起動時間と挙動を確認します。
まとめ
- Windows/WSL2環境では、プロジェクトファイルをWSL2内に置くことが最優先
- OPcacheを有効化して再検証頻度を低く設定すれば、PHP実行速度が向上します(効果は環境やアプリケーションの特性により異なります)
- キャッシュディレクトリの分離や不要サービスの停止によりファイル同期の負荷を減らすことで、起動時間や応答性がさらに改善します
以上の対策を組み合わせると、Docker開発環境の起動時間やファイル反映時間が飛躍的に短縮され、体感速度が大幅に向上します。
補足: その他の環境・ツールに関する考慮点
Mac環境での最適化
macOSでDocker Desktopを使用する場合も、ファイルシステムのパフォーマンスが課題になります。
- VirtioFS(推奨): Docker Desktop 4.6以降ではVirtioFSがデフォルトで有効化されており、従来のosxfsよりも大幅に高速です。設定から有効になっていることを確認しましょう。
-
キャッシュモードの指定: ボリュームマウント時に
:cachedや:delegatedを指定する方法もありますが、VirtioFS環境ではほぼ不要です。
volumes:
- .:/var/www/html:cached # VirtioFSでは不要だが、古いバージョンでは有効
開発ツール使用時の注意点
Xdebugを使用する場合、パフォーマンスへの影響が大きいため、必要なときだけ有効化する運用を推奨します。
# 環境変数で制御する例
xdebug.mode=${XDEBUG_MODE:-off}
xdebug.start_with_request=trigger
# docker-compose.override.yml
services:
web:
environment:
- XDEBUG_MODE=debug # 必要なときだけ設定
BlackfireやNew Relicなどのプロファイリングツールも、常時有効だとオーバーヘッドが発生します。プロファイリングが必要な時のみ起動するようにしましょう。
ボリュームマウントの注意点
名前付きボリュームに分離したvendorやnode_modulesは、コンテナ内でのみ存在します。以下の点に注意してください:
-
初回インストール: コンテナ起動後に
docker compose exec web composer installやnpm installを実行する必要があります - IDE補完: PhpStormやVSCodeで補完を効かせるには、ホスト側にも依存関係をインストールするか、リモート開発機能を使用します
パフォーマンス計測のすすめ
最適化の効果を定量的に把握するため、以下のような計測を行うことを推奨します:
# コンテナ起動時間の計測
time docker compose up -d
# ページ読み込み時間の計測(curl)
time curl -s http://localhost:8080 > /dev/null
# OPcache統計の確認
docker compose exec web php -r "print_r(opcache_get_status());"
最適化前後で計測することで、実際の改善効果を確認できます。