なんとなく最近解決したこと
LaravelがDocker上で重くなる理由について
最近、LaravelをDocker環境で触っていて「なんだか動作がものすごく遅いな」と感じることがありました。
開発初期の段階でも画面表示までに数秒かかったりして、正直かなりストレス。キャッシュのクリアや設定の見直しなど、いろいろ試してみたものの改善されず…。原因を調べていくうちに、どうやらvendorディレクトリをbind mountしていることが原因だとわかりました。
Laravelはvendorに依存している
Laravelでは、アプリケーションのあらゆる処理において vendor ディレクトリ内のファイルが読み込まれます。ServiceProviderやMiddleware、ルーティング、例外処理など、ほぼすべてがこの中に含まれています。そのため、vendorへのアクセス頻度は非常に高く、パフォーマンスに影響がでます!
bind mountによるパフォーマンス低下
Dockerで開発環境を構築する際、ホスト(自分のPC)とコンテナ間で vendor を共有(bind mount)すると、特にmacOSやWindowsではファイルI/Oが非常に遅くなるという問題があります。この遅延が、Laravel全体のレスポンス低下に直結していたみたいです。
解決方法として
「venderディレクトリをbind mountしない」という対応をしました。
venderディレクトリをvolumeとして扱うことで速いI/Oが可能になります。
bind mountでvendorをホストと共有していると、ホストOS側でも変更検知が走り、特に重いファイルが多いvendorはCPU・メモリを消費します。
vendorを名前付きボリュームにすればホストから見えなくなるため、監視対象外となり、負荷が減る。
という少し前に悩んでいたものでしたが、誰かの参考になれば...