みずぴー日記

人間の再起動ボタンはハワイのビーチにある

🐬Docker for Mac without qcow2

Docker for MacのファイルIOが遅い。VirtualBox上で動いているDockerと比較しても遅い。

これにはいくつかの原因があるが、その1つとしてディスクイメージのフォーマットとしてqcow2を用いていることがあげられる。

qcow2は書き込み時に必要な容量を確保するcopy on write方式のディスクイメージだが、これを事前に必要な容量をすべて確保するrawファーマットに差し替えたところ、パフォーマンスが改善した。

使い方

既存のDockerイメージは消えます

https://github.com/mzp/docker.img

curl https://raw.githubusercontent.com/mzp/Docker.img/master/install.sh | bash

ベンチマーク

fioを用いてベンチマークを行なったところ、Docker Machine(VirtualBox)と同程度のパフォーマンスはでるようになった。*1

読み込み

Average(MiB/s) Min(MiB/s) Max(MiB/s)
native 361 361 361
docker machine 105 105 105
qcow2 46 46 46
raw 147 147 147

書き込み

Average(MiB/s) Min(MiB/s) Max(MiB/s)
native 487 487 487
docker machine 51 51 51
qcow2 29 29 29
raw 45 45 45

やっていること

Docker for Machyperkitを使い、macOS上でLinuxを動かし、その上でDockerを動かしている。

hyperkitはrawフォーマットのイメージに対応しているので、Docker for Macが起動する際にhyperkitに渡す引数を変更することで、ディスクイメージをqcow2からrawに差し替えている。

ただ起動時に渡す引数を設定で変更することができないので、hyperkitのバイナリをシェルスクリプトに差し替えて、無理矢理変更している。

*1:実行したコマンド等は https://github.com/mzp/docker.img に書いた