復制一個大佬的回答
Docker for Windows是在Hyper-V虛擬機上跑Linux,文件掛載是通過SMB協議從Windows掛載到Linux,文件讀寫都經過網絡,遇到Laravel這種每次啟動就要加載幾百個文件的框架,文件性能問題就尤其明顯。
最好的驗證方法就是進到容器里,strace一下php-fpm進程,看下系統調用的耗時,你就會發現大部分時間都是在stat或read,所以解決的思路就是減少網絡文件系統的讀寫。
方案0: 開opcache,減少read調用
方案1:不使用SMB協議掛載文件,通過union、rsync之類的工具同步文件修改。
方案2: 用WSL2
方案3:修改cifs內核模塊,單獨加大vendor目錄的緩存時間,因為vendor目錄下的文件很少變更,加大文件信息的緩存時間可以減少大量網絡調用。加上方案0,響應時間從1秒減少到0.1秒。(現在我就在用這個方案,自己在Hyper-V跑Arch Linux + 修改過的cifs模塊化 + docker)
Github有相關的討論:Shared Volumes Slow ,基本都是方案0-2。