ちょっと話題の記事

[小ネタ] Docker for Mac のデータを縮小する(Docker.qcow2 の肥大化対策)

2017.04.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、藤本です。

先日、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 を停止します。

screenshot_2017-04-01_14_52_33

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

イメージファイルが再度生成されました。

まとめ

同じように困っている方の参考になれば幸いです。

参考リンク