MacでDockerがディスク領域を使いすぎる理由と解決法
MacでDockerがこれほど領域を使うのは、Dockerが保存するもの、つまりすべてのイメージ、コンテナ、ボリューム、ビルドキャッシュのエントリが、Docker.rawという1つの仮想ディスクファイルの中にあり、自分で削除するまで何も削除されないからです。領域を取り戻すには、docker system prune とその関連コマンドを使って、Docker内で整理(prune)します。
FinderでDocker.rawを削除しないでください。ボリューム内のデータベースも含め、すべてが一度に消去されます。以下の手順は、最も安全な整理から最も徹底的な整理へと進みます。
Dockerの領域が実際にある場所
Docker Desktopは、小さなLinux仮想マシンの中でコンテナを実行します。そのマシンのディスクはMac上の1つのファイルで、~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw にあります。
このファイルはスパースファイルです。使用中の量がはるかに少なくても、Finderには許容される最大サイズで表示されることがあります。下記のコマンドは、両方の数値を表示します。最初の列がディスク上で実際に占めている領域で、行の後ろのほうにあるサイズが最大値です。
macOSの中からコンテナのファイルを削除できないのも、どのディスクツールでもこのフォルダが1つの巨大な項目に見えるのも、このためです。
ls -klsh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw何が領域を使っているかを確認する
Docker Desktopを実行した状態で、Dockerに内訳を尋ねます。下記のコマンドは、イメージ、コンテナ、ローカルボリューム、ビルドキャッシュの4つを、それぞれの合計サイズと、そのうち回収可能な量とともに一覧表示します。
-v を付けると、イメージ、コンテナ、ボリュームごとに1行ずつ表示されます。1分かけて読む価値があります。ほとんどの開発マシンでは、大きいのは古いイメージとビルドキャッシュですが、ボリュームが大きい場合、それはデータであり、より慎重に扱う必要があります。
docker system dfステップ1:安全な整理
下記のコマンドから始めます。停止中のコンテナ、どのコンテナにも使われていないネットワーク、宙ぶらりんのイメージ(タグも参照もなくなったレイヤー)、未使用のビルドキャッシュが削除されます。Dockerは削除するものを一覧表示し、確認を求めます。
タグの付いたイメージ、実行中のコンテナ、ボリュームは削除されません。多くの人にとっては、これで十分です。
ここで削除されるものに、取り戻すのが難しいものはありません。削除したコンテナはイメージからもう一度作成でき、ビルドキャッシュの代償は次のビルドが遅くなることだけです。確認しておくべきなのは1点だけで、停止中のコンテナの中に、そこで書き込んだまま外にコピーしていないファイルがないかどうかです。
docker system pruneステップ2:未使用のイメージとビルドキャッシュ
さらに必要な場合は、イメージとビルドキャッシュに的を絞ります。
- docker image prune -a は、タグの有無にかかわらず、どのコンテナも使っていないイメージをすべて削除します。次に必要になったときに、もう一度プルまたはビルドすることになります。
- docker builder prune は、ビルドキャッシュを削除します。-a を付けると、宙ぶらりんの部分だけでなく、すべてが削除されます。次のビルドはキャッシュなしで始まり、時間がかかります。
- docker system prune -a は、上記の2つとステップ1の整理をまとめて行います。
- docker container ls -a は、停止中のコンテナを表示します。まだ残しておきたいコンテナが、大きなイメージを使用中の状態にしていることがあります。
ステップ3:ボリュームは慎重に
ボリュームは、データベースのファイル、アップロード、パッケージキャッシュなど、残しておくべきデータをコンテナが保存する場所です。整理すると本物の作業内容が削除されることがあるので、まず確認してください。
下記の1つ目のコマンドで一覧表示し、どのプロジェクトのものかを確認します。2つ目のコマンドは、どのコンテナも使っていない匿名ボリュームを削除します。-a を付けると、どのコンテナも使っていない名前付きボリュームにも対象が広がります。ローカルの開発用データベースは、たいていそこにあります。
大切なボリュームであれば、整理する前にバックアップするか、データベースをダンプしておきます。Composeプロジェクトのボリュームは、プロジェクトフォルダで docker compose down -v を実行すれば、そのプロジェクトと一緒に削除できます。
docker volume ls
docker volume pruneMacに領域を戻す
整理のあと、Docker Desktopは、仮想ディスク内で解放された領域をmacOSに返します。Docker.raw形式では、通常これはすぐに行われますが、ファイルの最大サイズを表示するツールでは変化が見られません。実際の数値を見るには、最初のセクションの ls コマンドをもう一度実行します。
今後これほど大きくならないようにするには、Docker Desktopを開いて「Settings」>「Resources」と進み、ディスク使用量の上限を下げます。変更によって既存のデータが消去される場合は、Dockerが警告します。
完全に最初からやり直したい場合は、Docker Desktopの「Troubleshoot」画面に、「Clean / Purge data」オプションと、出荷時の設定へのリセットがあります。どちらも、すべてのイメージ、コンテナ、ボリュームを削除します。
Docker.rawの中にないもの
Dockerに関連するものの一部は、仮想ディスクの外にあります。コンテナにマウントするフォルダはMac上の普通のフォルダであり、どの整理でも手を付けられません。プロジェクトフォルダには、node_modulesのような独自のビルド出力があります。また、Docker Desktopを削除しても、そのヘルパー、グループコンテナ、~/.docker フォルダは、自分で削除しないかぎり残ります。
Diskzyが役立つところ
Diskzyは、Docker.rawが実際にどのくらいの大きさなのかをディスクマップに表示するので、Docker内で整理すべきタイミングがわかります。ファイルを縮小することはしません。
Docker Desktopを完全に削除すると決めた場合は、Diskzyの「Uninstall」(アンインストール)が、コンテナ、LaunchAgent、特権ヘルパーなど、アプリが残したものと一緒にアプリを削除します。すべてゴミ箱に入ります。
よくある質問
- 領域を空けるためにDocker.rawを削除できますか?
- すべてのイメージ、コンテナ、ボリュームを失ってもかまわない場合だけです。Docker Desktopは、次に起動したときに新しい空のファイルを作成します。使っているものを残したまま領域を空けるには、代わりにDocker内で整理してください。
- イメージが少ないのにDocker.rawがこれほど大きいのはなぜですか?
- Finderには、使用量ではなく、ファイルの最大サイズが表示されることがよくあります。実際のサイズは ls -klsh で確認してください。それでも大きい場合は docker system df を実行します。隠れた原因は、たいていビルドキャッシュとボリュームです。
- docker system prune を実行するとボリュームは削除されますか?
- デフォルトでは削除されません。停止中のコンテナ、未使用のネットワーク、宙ぶらりんのイメージ、未使用のビルドキャッシュが削除されます。ボリュームが削除されるのは、--volumes フラグを付けた場合か、docker volume prune を実行した場合だけです。
- 整理したあと、ディスク領域は戻りますか?
- はい。Docker Desktopは、整理のあとまもなく、Docker.raw内で解放された領域をmacOSに返します。Finderに表示される最大サイズは変わりませんが、ディスク上で使用されている領域は変わります。
関連ガイド
- Docker.raw~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
- Containers~/Library/Containers
- Group Containers~/Library/Group Containers
- node_modules<project>/node_modules
アンインストールガイド
Macの空き領域がどこに消えたのかを確認
Diskzyはディスク全体をマップにし、システムデータの内訳を示し、安全なものを消去します。72時間は無料、その後は$9の買い切りでMac 2台まで使えます。
Diskzyを無料で試す