1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

重いDocker開発環境を軽くする4つの実践的手法(2025年版)

Last updated at Posted at 2025-11-04

Dockerで作成したlocal開発環境が重い...。
そんな悩みを抱えている方におすすめの設定をご紹介します。

私も重いDocker環境に悩んでいましたが、下記変更を行ったことによりかなり改善されました。

環境によるところはありますが、4つのうち一部のみの変更でもだいぶ変化がみられると思います。
気になった方はぜひ取り入れてみてください!

1. PHP OPcache の最適化

有効化と開発用設定

php.iniopcache.enable=1にし、OPcacheを有効にします。開発環境ではopcache.validate_timestamps=1(変更検知有効)にし、opcache.revalidate_freqを小さな値(例: 2秒)に設定すると、ファイル変更がすぐ反映されます。

PHP8以降のデフォルトでも revalidate_freq=2enable_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/cachevendor(依存ファイル)など変更頻度が高い・容量が大きいフォルダだけを名前付きボリュームに切り出します。

例えば下記のように設定します:

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/cachevendor(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ファイルに記述できます。

これによって本番向け設定を壊さず、開発時だけ有効にしたいオプションを簡単に管理できます。

実装手順(概要)

  1. WSL2内にプロジェクト配置: Windows上のプロジェクトをWSL2にコピーまたはクローンし、WSL2のターミナルで作業します。

  2. PHP設定の更新: docker/php.iniなどにOPcache設定を追加します。コンテナ起動時にこれらの設定が読み込まれるようにDockerfileでコピーするなどして反映させます。

  3. Compose設定の用意: 開発用にdocker-compose.override.ymlなどを作り、環境変数・ボリューム設定・ポート公開を追加します(例: キャッシュボリュームの定義やAPP_ENV=developmentの設定など)。

  4. コンテナ起動・検証: 既存のコンテナを停止(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  # 必要なときだけ設定

BlackfireNew Relicなどのプロファイリングツールも、常時有効だとオーバーヘッドが発生します。プロファイリングが必要な時のみ起動するようにしましょう。

ボリュームマウントの注意点

名前付きボリュームに分離したvendornode_modulesは、コンテナ内でのみ存在します。以下の点に注意してください:

  • 初回インストール: コンテナ起動後にdocker compose exec web composer installnpm 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());"

最適化前後で計測することで、実際の改善効果を確認できます。

参考資料

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?