docker for macでのmountディレクトリ遅い問題を解消するためのcached設定についての記事が出てた。実際にLaravelの開発でも、mountディレクトリでホスト側のファイルを読み込ませるとページ表示がもっさりするので、待望の設定です。
User-guided caching in Docker for Mac - Docker Blog
上記の記事通りにパフォーマンスが改善されるのか、stableバージョンとedgeバージョンの両方でLaravelのwelcomeページ表示をターゲットにして計測してみた。
現状のstableバージョンで確認
docker for macのバージョン。2017/05/10現在
1 | $ docker version |
mountディレクトリの有り版、無し版でsiegeでパフォーマンスを計測。
1 | $ siege -q -c 1 -r 10 localhost |
結果
| 項目 | mount有 | mount無 |
|---|---|---|
| Elapsed time | 12s | 4s |
| Response time | 0.7s | 0.05s |
| Transaction rate | 0.9 trans/s | 2.2 trans/s |
| ※数値は数回実行した結果の適当な平均値 |
ホストのディレクトリをmountすると、Response timeで10倍くらい遅くなる。もっさりするワケだ。
Edgeバージョンで計測。
まずは dockerをuninstall。uninstallは設定からやるのでした。

※uninstallのボタンを押して処理が終わったら、ApplicationディレクトリからDockerを削除。ゴミ箱からも消す。
https://docs.docker.com/docker-for-mac/
↑のページにedgeのリンクがあるのでダウンロードしてインストール
1 | $ docker version |
User selected cacheは17.04以降に入っているので、17.05なら使える
cached設定は、volumesの設定箇所のディレクトリ名の後ろに追加する
1 | version: '2' |
結果
mount有、mount無、cachedの3つを計測
| 項目 | mount有 | mount無 | cached |
|---|---|---|---|
| Elapsed time | 12s | 4s | 7s |
| Response time | 0.7s | 0.05s | 0.22s |
| Transaction rate | 0.9 trans/s | 2.2 trans/s | 1.4 trans/s |
| ※数値は数回実行した結果の適当な平均値 |
mount無しよりは遅いけど、オプション無しの場合よりは3倍程度速い。
ブラウザのリロードの体感だと、ほぼストレスがないレベル。
docker for macを使って開発する場合は、edgeバージョンを使って、cachedフラグをvolumeにつけると幸せになれそう。Readが速くなるので、gulpとかwebpackでwatchタスクをコンテナ内から実行すると、CPU負荷が猛烈に上がる問題もcachedオプションで緩和されそうです。
補足
ちなみに、この方法では writeスピードは早くならない。
1 | $ docker run --rm -it -v `pwd`:`pwd` -w `pwd` alpine /usr/bin/time /bin/dd if=/dev/zero of=test bs=1k count=100000 |
writeスピード向けの対応としてdelegateオプションというのが開発中らしい。
待ち遠しい…