Docker for macでDocker.qcow2というファイルが肥大化する件

2016年12月15日

Docker便利ですね。

Docker for macが出てからは、もうmac上には環境を作らない
なんて運用も可能じゃないかというくらいです。

実際、サーバサイド系の環境はほぼ全てDockerで運用してます。
gulpとかでブラウザのオートリロードとかしたい場合は
さすがに難しいので、そこはmac上に環境を作っておりますが。

ということで、ハードにDocker for macを使っていくと
ディスク容量が日々減っていくのが実感出来るかと思います。

これは、Docker for macも実体はVMであり
VMのディスクとして仮想ディスクがあり
この仮想ディスクが
~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
に作成されています。

単純に考えると、docker imagesで表示されるイメージで容量を消費しているならば、docker rmiでイメージを消したら良いのでは?と思うのですが
そこはVM、仮想ディスクは一度領域を広げたら、通常運用では領域を解放してくれません。

ですので、この仮想ディスクを手で小さくしてあげないといけないです。

一番簡単な方法は

メニューバーに表示されているDocker for macのアイコンの中の
Preferancesからresetを開いてReset factory defaultsを選ぶこと。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-15-9-52-06

この仮想ディスクをクリアするコマンドでは、今までpullしたイメージや起動させたコンテナなども消してしまいます。

Dockerの運用ではあまりないかとは思いますが
コンテナにその場限りではあるけど変更を持ってて
コンテナとかを消したくない、といった場合はこの方法をとると
大切な変更が失われてしまいます。

そこで、仮想ディスクをshrinkする方法をとることで
現状を維持したまま
仮想ディスクを小さくする、といったことが可能になります。

方法ですが、
brewが入っている前提ですが

brew install qemu

でqemuというツールをインストールします。
このqemuというのは、仮想マシンの一種になります。

仮想マシンで有名なところですと
VirtualBoxとかVMwareあたりになると思いますが、これらと
似たソフトウェアになります。

で、Docker for macで使用している仮想ディスクのフォーマットは
このqemuのディスクイメージフォーマットを採用しております。
なので
仮想ディスクのファイル名が
Docker.qcow2
となっています。

さて、qemuのインストールが完了したら
このツールの中の
仮想ディスクを操作するコマンドがあるので
そのコマンドを使って
Docker.qcow2
を変換かけます。

変換をかける前に、考慮する部分があり
通常ディスク上でファイルを削除した場合にはインデックス上で削除したという情報を管理して、実体は消えていない状態ですが
通常の場合だとそこに上書きすることになるので、容量があるという見え方になりますが、仮想ディスクはそのインデックス上では削除されているけれど、実体がある場合も、ディスク容量として消費していることになります。
この削除されているけれど実体がある部分を綺麗にしてから
変換をすることで、効率よくファイルを小さくする事が出来ます。

ということで、実際に変換するためのコマンドは
以下のようにします。

これを実行する際に、いらないコンテナ、イメージは全て削除しておくことをお勧めします。

docker ps -a

で一覧表示されるコンテナの中からいらないものを全て削除します。
次に

docker images

で表示されるイメージで不要そうなものを全て削除します。

続いて、Docker for macの本体になるVMにログイン

cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
screen tty

仮想ディスク内で削除されているファイル群を削除します。

dd if=/dev/zero of=/var/tempfile
rm /var/tempfile

この方法の欠点は、ディスクフル(Docker.qcow2のディスクサイズ上限 or macのディスク上限)になるまでゼロ埋めファイルを作ってからそのファイルを消すということをやるので、macの容量が少ない場合は結構難しいです。
自分の場合は、ddでサイズ指定(例えば、Docker.qcow2の現在のファイルサイズの半分くらい)をして、消してます。

screenから抜けて

ctl+a,d

Docker for macを停止します。
Docker for macの停止の仕方は自分がまだ分かってないので、アレなのですが、
Docker for macのPreferenceから、Start Docker when you log inをoffにしてquitしてmacを再起動してます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-15-9-59-53

それから仮想ディスクファイルをshrinkします。

qemu-img convert -O qcow2 Docker.qcow2 Docker.qcow2.new

実行時間は、そこそこ長いです。

実行が終わると、
Docker.qcow2.new
というファイルが出来上がっていると思います。

-rw-r--r-- 1 gen staff 39627259904 12 12 11:53 Docker.qcow2
-rw-r--r-- 1 gen staff 22887333888 12 12 11:51 Docker.qcow2.new

半分位になりましたね。

出来上がったら、一応ですが古い方はリネームしておいて
新しいものに差し替えます。

差し替えた状態で、Docker for macを起動します。
無事に起動して、dockerコマンドが通るようになれば、問題なくshrinkが完了しました。
古い方のDocker.qcow2を削除しましょう。

これで、溜まりに溜まったDocker.qcow2のディスクが綺麗になりました。

アンケート