容量がある場所
macOSのDocker DesktopはLinuxの仮想マシンを動かしており、その仮想マシンのファイルシステム全体が、Mac上の1つのスパースファイルになっています:
~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
論理サイズではなく、ディスク上の実サイズを確認してください。論理サイズは常に、Dockerに許可した上限値です:
du -h -d0 ~/Library/Containers/com.docker.docker/Data/vms/0/data/
イメージを削除しても縮まない理由
イメージを削除すると、仮想マシンのファイルシステムの 内部で ブロックが解放されますが、Mac上のファイルはサイズを保ったままです。すでにその分をmacOSから確保しているからです。最近のDocker Desktopは仮想マシン内からTRIMを発行し、解放されたブロックをmacOSが回収できるようにしますが、それはpruneした瞬間ではなくDockerの都合で行われます。それまでは docker system df がギガバイト単位の解放を報告する一方で、Finderはまったく変化を示しません。
容量を取り戻す
破壊的でない順に並べています。
1. Dockerが何を使っていると考えているか見る
まずここから。イメージ、コンテナ、ボリューム、ビルドキャッシュに分けて、それぞれどれだけ回収可能かを教えてくれます。
docker system df -v
2. ビルドキャッシュを消す
日常的にイメージをビルドするマシンでは、たいていこれが最大の単一項目であり、しかも消すのがいちばん安全です。次のビルドが遅くなるだけです。
docker builder prune -a
3. 本当に使われていないものを整理する
停止したコンテナ、宙に浮いたイメージ、使われていないネットワーク:
docker system prune
次を付けると -a 実行中のコンテナが使っていないイメージもすべて削除されます。つまり後で取得し直すことになります。次を付けるのは --volumes 確信があるときだけにしてください: ボリュームにはデータベースのデータが入っています。このページで唯一、再ダウンロードできないものを壊すコマンドです。
4. 触る前にボリュームを一覧する
実際に何が消えるのか確認しましょう:
docker volume ls
docker volume ls -f dangling=true
Dockerだけということはめったにありません
このページのコマンドをすべて実行できますが、同じMacではXcodeのDerivedDataと、忘れ去られたモデルの重みが同じくらい大きいのが普通です。BytesweepはDockerのディスク上の実サイズを、それらすべてと並べて10秒で測ります。1つずつ追いかけるのではなく、ディスクを一度で片付けられます。
5. macOSにファイルを回収させる
pruneのあと、解放されたブロックを返すための正式な方法がDocker Desktopにあります: 設定 → リソース → 詳細 → ディスク使用量、またはDocker Desktopを終了して開き直すと、起動時にTRIMが実行されます。1分ほど待ってからファイルサイズを見直し、それから効かなかったと判断してください。
6. ディスクの上限を下げる
次の場所: 設定 → リソースの仮想ディスク上限は、Docker.rawがどこまで大きくなってよいかの値です。下げても単体で容量が空くわけではありませんが、問題の上限を決められます。「念のため」に上げたことが、そのファイルが64 GBになった原因です。
7. 最後の手段
設定 → トラブルシューティング → Clean / Purge data は仮想マシンのディスクを完全にリセットし、ファイルをほぼゼロに戻します。イメージ、コンテナ、ボリュームのすべてが消えます。他に手がなく、ボリュームの中身を把握しているときに使ってください。
FinderでDocker.rawを削除しないでください。 これはキャッシュファイルではなく、Dockerインストール全体のデータです。Dockerの実行中に消すと、結局リセットが必要な状態になることがあります。
あわせて確認したいこと
Dockerだけとはかぎりません
Dockerが50 GBに達したMacでは、XcodeのDerivedDataとローカルAIモデルもたいてい肉薄しています。容量を取り戻すなら、1つずつ直すよりディスク全体を一度測る価値があります。 一覧の全文 →
Linuxにはイメージファイルがありません
LinuxのDockerは次の場所へ直接書き込むため、 /var/lib/dockerpruneすればすぐに容量が空き、上記のTRIMの問題は起きません。 Linuxのディスク整理 →
Dockerを、ほかのすべてと並べて見る
BytesweepはDockerのディスク上の実サイズを測り、Xcode、シミュレータ、node_modules、モデルの重みと並べて表示し、ボリュームには触れずに、消して安全なものを示します。
よくある質問
Docker.rawを削除しても安全ですか?
Finderからは、そしてDockerの実行中は安全ではありません。あの1つのファイルが、あなたのイメージ・コンテナ・ボリュームのすべてです。本当にまっさらにしたいなら、Docker Desktopの「トラブルシューティング → Clean / Purge data」を使ってください。同じことを、Dockerが把握できる形で行います。
docker system pruneが20 GB解放したと言うのに、何も変わらないのはなぜ?
仮想マシンのファイルシステム内で20 GBを解放したのであって、Mac上ではないからです。TRIMが実行されてmacOSがブロックを回収するまで、ファイルはサイズを保ちます。Docker Desktopを終了して開き直すと、たいてい実行されます。
docker system pruneはデータベースを消しますか?
次を付けたときだけです: --volumes。付けなければボリュームには触れません。付けると、コンテナに接続されていないボリュームはすべて消え、停止中のデータベースのボリュームは未接続とみなされます。
Docker.rawはどれくらいの大きさが適切ですか?
正解はありませんが、稼働中のプロジェクトが数個あるマシンなら15〜25 GBが普通で、60 GBならビルドキャッシュが一度も消されていないということです。イメージのせいだと決めつける前に、次で確認してください: docker system df -v 。
