[小ネタ] Docker for Mac のデータを縮小する(Docker.qcow2 の肥大化対策)
こんにちは、藤本です。
先日、Macbook のディスク使用量が 90% を超えていたので整理していました。原因は色々とあったのですが、Docker for Mac で 16 GB ぐらいを使っていたのでシュリンクする方法を調べてみました。
概要
Docker for Mac は Mac 上で Docker を利用するツールです。Docker for Mac に関しては下記エントリをご参照ください。
Docker for Mac は Apple の Hypervisor フレームワーク上で動作します。Docker for Mac の仮想マシンが動いています。ディスクは QEMU のイメージファイルが作られ、Docker イメージや、Docker コンテナが増えていくにつれて仮想マシンのディスク使用量、つまりイメージファイルは肥大化していきます。イメージファイルは一度、肥大化すると Docker イメージを削除しても、Docker コンテナを削除してもサイズはシュリンクされません。
Docker for Mac のデフォルトのイメージファイルパスは下記となります。
$ du -m $HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 16789 /Users/fujimoto.shinji/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
今回は 2つの方法をご紹介します。
イメージファイルをシュリンクする
一つ目は Docker イメージ、Docker コンテナを残しつつもイメージファイルをシュリンクする方法です。Qcow2 形式のイメージファイルをベースイメージファイルから再作成することで実使用領域のみのディスク使用量とします。別のサイトでは一度ディスク領域をゼロ埋めすることで効果を発揮するとの記載がありますが、ゼロ埋めせずとも効果はありました。
それでは試してみましょう。不要な Docker イメージ、Docker コンテナを削除します。私は全て削除しました。
$ docker rm $(docker ps -qa) $ docker rmi $(docker images -fqa)
作業前に Docker for Mac を停止します。
Qdow2 ファイルを変換します。
$ cd $HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/ $ du -m Docker.qcow2 16789 Docker.qcow2 $ qemu-img convert -O qcow2 Docker.qcow2 New.qcow2 $ du -ms ./*.qcow2 16789 ./Docker.qcow2 6193 ./New.qcow2
10 GB 以上削減できました!
シュリンクしたイメージファイルを置き換えます。一応元ファイルもバックアップを取っておきます。
$ mv Docker.qcow2 Docker.qcow2.bak $ mv New.qcow2 Docker.qcow2
Docker for Mac を起動します。
一応使えるか確認。。
$ docker run -it alpine /bin/sh Unable to find image 'alpine:latest' locally latest: Pulling from library/alpine 627beaf3eaaf: Pull complete Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Status: Downloaded newer image for alpine:latest / # cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.5.2 PRETTY_NAME="Alpine Linux v3.5" HOME_URL="http://alpinelinux.org" BUG_REPORT_URL="http://bugs.alpinelinux.org"
うん、だいじょうぶそう。
イメージファイルを削除する
もう一つはシュリンクではないですが、イメージファイルを削除します。イメージファイルがなくても起動時に再生成してくれます。私は結局こちらで対応しました。Docker イメージや、Docker コンテナで必要なものがなければこれが一番簡単!
Docker for Mac を停止し、イメージファイルを削除します。
$ rm $HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
Docker for Mac を起動します。
$ du -m $HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 1296 /Users/fujimoto.shinji/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
イメージファイルが再度生成されました。
まとめ
同じように困っている方の参考になれば幸いです。