「よし、新しい機能の開発のためにサクッとDockerコンテナを立ち上げよう!」
ターミナルで docker-compose up -d を叩いた瞬間、全く予期せぬエラーメッセージが返ってきます。
Error answer from daemon: write /var/lib/docker/tmp/... : no space left on device
「えっ?デバイスに空き容量がない?つい先日MacのSSDを掃除したばかりなのに!?」
実はこれ、Mac本体のディスクが満杯なのではなく、Dockerが内部で確保している仮想ディスク(仮想マシン)がパンクしたという、Docker独自の非常に厄介な「見えない容量不足」エラーなのです。
本記事では、このエラーの背後にあるDockerのキャッシュ戦略(レイヤー構造)を紐解きながら、無駄になったGBレベルのゴミデータを一瞬で掃除する「完全断捨離術」と、今後二度と容量不足に泣かないための予防線について徹底解説します!
1. なぜDockerは信じられないほどディスクを食うのか?
Dockerは「コンテナ」という軽量な技術を使っていますが、実のところ裏側ではベースとなる「Image(イメージ)」を何層にも重ねて保持しています(これをレイヤー構造と呼びます)。
例えば、AIを開発するために FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 をベースイメージに指定したとします。これだけで既に数GBの容量を消費します。
さらに、ライブラリ追加のために RUN pip install torch torchvision を実行すると、さらにGB単位の新しいレイヤーが作成されます。
ここからが悲劇の始まりです。あなたが「ちょっとコードを直して再ビルドしよう(docker build)」とするたびに、Dockerは「念のため以前の失敗したビルド途中のレイヤー(Dangling Image:宙ぶらりんの画像)」もこっそり保存し続けます。
これを繰り返すうちに、実際には使っていない「過去の残骸」が数十GB〜数百GBも仮想ディスクを圧迫し、ある日突然 No space left on device で突然死するのです。
2. 容量不足を救う魔法の「断捨離コマンド」
このエラーに直面したら、焦って一つずつイメージを消す必要はありません。
Dockerには、現在全く使われていない「ゴミデータ」を一掃するための強力な大掃除コマンドが用意されています。
① 軽度な掃除:prune(剪定)
# 現在動いていないコンテナ、ネットワーク、Dangling(名前無しの宙ぶらりん)のイメージを全て削除
docker system pruneこれだけでも数GB〜十数GBの空き容量が復活することが多いです。
「本当に消してしまって大丈夫?」と心配になるかもしれませんが、起動中の本番コンテナや、名前(タグ)がしっかり付いているイメージは削除されないので、日常のメンテナンスとして非常に安全で有用です。
② 究極の断捨離:すべてを消し去る(※要注意)
「どうせDockerのイメージなんて、Dockerfileさせあれば何度でも1から作り直せるさ!」という割り切ったマインドを持てる方には、以下の強力なコマンドをお勧めします。
# 【注意】現在動いて「いない」イメージ(タグありでも)を全て削除します!
# 完全に環境をリセットしたい開発用ローカルPCなどでのみ使用してください。
docker system prune -a --volumesオプションの -a は「すべての未使用イメージ」、--volumes は「使われていない名前付きデータボリューム群」まで全て消し去るという最終兵器です。私の経験上、これを叩くと一気に100GB以上の空き容量が復活し、Macの動作まで見違えるように軽くなることがよくあります。
3. 今後のトラブルを防ぐ:Dockerfileのベストプラクティス
掃除の仕方を学んだら、次は「そもそもゴミを出さない」技術を身につけましょう。
Dockerfileを書く際、巨大なファイルをダウンロードして解凍・インストールした後、そのままにしておくのは御法度です。
「RUN命令は極力1つにまとめ、最後に必ずキャッシュを消す」
この鉄則を守るだけで、出来上がるイメージのサイズは劇的に縮小し、容量不足のエラーとは無縁の生活が送れます。
# 【悪い例】命令ごとにレイヤーが作られ、aptのキャッシュが残り続ける
RUN apt-get update
RUN apt-get install -y gcc make
RUN rm -rf /var/lib/apt/lists/*
# ===============================
# 【良い例】すべての実行を && で繋ぎ、1つのレイヤーの中に閉じ込める。
# これにより、途中で発生した一時ファイルやキャッシュが後のレイヤーに持ち越されない!
RUN apt-get update && apt-get install -y --no-install-recommends gcc make && apt-get clean && rm -rf /var/lib/apt/lists/*まとめ:Dockerは「捨てる勇気」を教えてくれる
「No space left on device」のエラーは、単なる容量不足ではなく、あなたのインフラ運用が「作っては放置」のルーズな状態になっていることを警告してくれています。
Infrastructure as Code(コードとしてのインフラ)の真髄は、「いつ壊れても、いつ全削除しても、たった1つのコマンド(docker-compose up)で環境が完璧に蘇る」という点にあります。
エラーが発生した際は、継ぎ接ぎで直すのではなく、一度 prune -a で全てを吹き飛ばし、クリーンな状態からビルドし直す癖をつけましょう。それこそが、最強のエンジニアリングマインドです。


コメント