Docker + Laravelの速度改善
下記の記事を参考にして、改善できました、ありがとうございます。
https://qiita.com/tyamahori/items/f627f85c7316e096a061
結論もそのままです。「ファイルのマウントを極力少なくする!」
備忘録として、経緯や調査の流れを書き出しておきたいと思います
- Docker desktop + win + wsl2 + Laravel環境使用
- さほど高機能でないサイトのトップページの表示に、約5秒かかる状態
- docker-compose.ymlのvolumes部分で、cached(delegated)オプションを設定する記事発見 → 体感できず
webserver:
volumes:
– ${APPLICATION}:${PROJECT}:delegated - docker-syncというミドルウェア?を使う記事発見 → 上手く動作せず
- ファイルマウントを減らす記事発見 → 理解不足で上手く動作せず
- dockerのファイルマウントと、volumesの仕様と書き方を学び直して、Dockerfileとdocker-compose.ymlの修正。
- docker-composeのボリュームマウント時に、(たしか)ディレクトリが無くてエラーになるため、Dockerfile実行時にディレクトリを作るようにする。下記のように、シェルスクリプトで最後に呼び出す形にした。
ENTRYPOINT [“/startup.sh”]
#!/bin/bash
mkdir -p /var/www/project/storage/framework/cache/data
mkdir -p /var/www/project/storage/framework/sessions
mkdir -p /var/www/project/storage/framework/views
mkdir -p /var/www/project/storage/framework/testing
chmod -R 777 /var/www/project/storage
composer install -d /var/www/project
composer dump-autoload
/usr/sbin/apachectl -DFOREGROUND
- ローカル↔webserverコンテナ(Laravelとか入ってる)のファイル同期がアクセスに時間かかる原因の模様
- アクセスが多いけど、ローカルに持っておく必要がないディレクトリを、docker-compose.ymlでボリュームマウントすることで、ローカルとは同期されなくなる(厳密には、ローカルにつくられたボリュームコンテナ?とwebserverコンテナは同期してるっぽい)
webserver:
volumes:
– ${APPLICATION}:${PROJECT}:delegated
# ignore
– ${PROJECT}/storage/framework
– ${PROJECT}/storage/app
– ${PROJECT}/vendor
- vender以下とcache系ファイルの同期を切ることで、5秒かかっていたのが2.5秒程度になった
- まだ遅く感じるが、だいぶストレスが減ったので、ひとまずこれで良しとした
感想:Dockerは便利で楽しいが、やはり学習コストがかかると感じた。公式ドキュメント読むの大事。