【初心者向け】docker image pruneとは?使い方をわかりやすく解説


【初心者向け】docker image pruneとは?使い方をわかりやすく解説

Dockerを学び始め、docker builddocker run を使ってコンテナを動かす楽しさに目覚めたあなた。しかし、しばらく使っていると、ふと気づくことがあります。

「あれ…?なんだかPCの動作が重い…」
「Cドライブの空き容量が、いつの間にか真っ赤になっている!」

その原因、もしかしたらDockerが溜め込んだ「不要なイメージ」かもしれません。

Dockerは非常に便利なツールですが、意識せずに使っていると、ビルドの過程で生まれた中間イメージや、古いバージョンのイメージがどんどん蓄積され、貴重なディスクスペースを圧迫していきます。数十GB、場合によっては数百GBもの容量が、知らず知らずのうちに消費されていることも珍しくありません。

この記事は、そんなDocker初心者が直面しがちな「ディスク容量問題」を解決するための、いわば「Dockerのお掃除マニュアル」です。

この記事を読めば、以下のことがわかります。

  • そもそも、なぜDockerイメージは勝手に増えてしまうのか?
  • 不要なイメージを安全かつ効率的に削除する魔法のコマンド docker image prune とは何か?
  • 基本的な使い方から、-a--filter などの強力なオプションを使いこなす方法
  • イメージだけでなく、コンテナやボリュームも含めたDockerシステム全体を大掃除する方法

この記事を最後まで読めば、あなたはもうディスク容量に怯えることなく、クリーンで快適なDocker環境を維持できるようになります。それでは、さっそくDockerのお掃除術をマスターしていきましょう!

第1章: なぜDockerイメージの削除が必要なのか?

docker image prune の使い方を学ぶ前に、まずは「なぜイメージの削除が必要になるのか」という根本的な理由を理解しておくことが重要です。原因がわかれば、対策もより深く理解できます。

Dockerイメージの正体とは?

Dockerイメージとは一体何でしょうか?一言でいえば、「アプリケーションとその実行環境をひとまとめにした、動かないテンプレート」です。

料理に例えるなら、「カレーライスのレシピと、必要なスパイスや具材一式が冷凍パックになったもの」を想像してみてください。この冷凍パックがDockerイメージです。このパックを温めてお皿に盛り付ければ、いつでも誰でも同じ味のカレーライス(=コンテナ)を食べることができます。

このイメージは、いくつかの重要な特徴を持っています。

  1. レイヤー構造: Dockerイメージは、一枚岩の巨大なファイルではありません。Dockerfile という設計図に書かれた命令(FROMRUNCOPYなど)が、それぞれ「層(レイヤー)」として積み重なってできています。玉ねぎの皮のように、薄い層が何枚も重なっているイメージです。この仕組みにより、一度作ったレイヤーはキャッシュされ、次回のビルドが高速になるというメリットがあります。
  2. 読み取り専用 (Read-only): イメージ自体は変更することができません。先程の冷凍パックの例で言えば、パックの中身を直接書き換えることはできませんよね。コンテナを起動すると、この読み取り専用のイメージの上に、書き込み可能な新しいレイヤーが追加され、そこでアプリケーションが動作します。

この「レイヤー構造」と「読み取り専用」という性質が、イメージが増えていく原因と深く関わっています。

イメージがどんどん増えていく理由

では、なぜ私たちの知らないうちにイメージは増殖していくのでしょうか。主な原因は以下の3つです。

1. docker build の繰り返し

アプリケーションを開発していると、ソースコードを少し修正しては動作確認、というサイクルを何度も繰り返します。そのたびに docker build コマンドを実行することになります。

“`bash

アプリケーションのイメージをビルドする

docker build -t myapp:latest .
“`

ここで重要なのは、docker build を実行するたびに、原則として新しいイメージが作成されるという点です。たとえ Dockerfile の内容が同じでも、ソースコードが1行でも変更されていれば、その変更を含む新しいレイヤーが作られ、結果として新しいIDを持つイメージが誕生します。

myapp:latest というタグは、常に最新のイメージに付け替えられます。すると、一つ前に myapp:latest だった古いイメージは、タグを失ってしまいます。このようなタグがない状態のイメージを「dangling image(ダングリング・イメージ)」と呼びます。「dangling」とは「宙ぶらりんの」「ぶら下がっている」という意味で、まさに誰からも名前(タグ)で呼ばれなくなった、孤立したイメージのことを指します。

これが、不要なイメージが溜まっていく最も一般的な原因です。

2. docker pull によるバージョンの更新

公式のイメージ、例えば nginxubuntu などを使うことも多いでしょう。これらのイメージは頻繁にアップデートされます。

ある日、あなたは nginx の最新版を使おうとして、以下のコマンドを実行します。

bash
docker pull nginx:latest

もし、あなたのローカル環境に既に nginx:latest が存在していて、Docker Hub側で新しいバージ عَョンがリリースされていた場合、Dockerは新しいバージョンのイメージをダウンロードしてきます。そして、nginx:latest のタグを新しいイメージに付け替えます。

この時、古いバージョンの nginx イメージはどうなるでしょうか? docker build の時と同じです。タグを失い、dangling imageとなってローカルに残り続けるのです。

3. タグ付け運用の結果

開発の現場では、バージョン管理のために、latest だけでなく、バージョン番号や機能名でタグを付けることがよくあります。

“`bash
docker build -t myapp:v1.0 .

…開発を進める…

docker build -t myapp:v1.1 .

…さらに機能追加…

docker build -t myapp:feature-x .
“`

このようにビルドしていくと、myapp:v1.0myapp:v1.1myapp:feature-x といったイメージがローカルに溜まっていきます。v1.1 が完成すれば v1.0 はもう使わないかもしれませんし、feature-x がマージされれば、そのイメージも不要になるかもしれません。しかし、これらはdangling imageではない(タグが付いている)ため、明示的に削除しない限り、ずっと残り続けます。

ディスク容量を圧迫する深刻な問題

これらの理由で増え続けたイメージは、やがてあなたのディスク容量を深刻なレベルで圧迫し始めます。

Dockerイメージは、便利な反面、サイズが大きいものが多いです。OSのベースイメージだけでも数百MB、開発に必要なライブラリやツールをインストールしていくと、1つのイメージが数GBに達することもザラです。

これが10個、20個と溜まっていくとどうなるでしょう?あっという間に数十GBのディスクスペースが消費されてしまいます。

ディスクの空き容量がなくなると、以下のような問題が発生します。

  • 新しいイメージのビルドが失敗する (no space left on device)
  • 新しいコンテナを起動できない
  • PC全体のパフォーマンスが低下する
  • OSのアップデートなど、他の作業もできなくなる

こうなってしまう前に、不要なイメージを定期的に「お掃除」する必要があるのです。そして、そのお掃除に絶大な効果を発揮するのが、次章から解説する docker image prune コマンドなのです。

第2章: docker image prune とは何か?

さて、不要なイメージがディスクを圧迫する原因がわかったところで、いよいよ本日の主役、docker image prune の登場です。このコマンドが一体何者なのか、その役割と安全性を詳しく見ていきましょう。

prune という単語の意味

まず、コマンド名にもなっている prune という英単語の意味を知っておくと、コマンドの役割をイメージしやすくなります。

prune (プルーン)
* 動詞: (樹木の枝などを) 刈り込む、剪定(せんてい)する
* 名詞: (乾燥させた) プラム

ガーデニングで、伸びすぎた枝や枯れた枝をハサミで切り落として、木の形を整え、風通しを良くする作業がありますね。あれが「剪定(prune)」です。

Dockerにおける prune コマンド群は、まさにこの剪定作業のように、Dockerシステム内に溜まった不要なリソース(イメージ、コンテナ、ボリューム、ネットワークなど)を「刈り込んで」整理整頓し、システムを健全な状態に保つためのものです。

docker image prune は、その中でも特に「イメージ」の剪定に特化したコマンドというわけです。

docker image prune の核心的な役割

docker image prune の役割を、一言で、かつ正確に表現するならば、こうなります。

どのコンテナからも現在参照されていない、宙ぶらりんの(dangling)イメージを、まとめて一括で削除するコマンド

ここで重要なポイントが2つあります。

  1. dangling image を削除する: 第1章で説明した、タグが <none>:<none> になっている「宙ぶらりんイメージ」が、このコマンドの主なターゲットです。docker build を繰り返すうちに量産されてしまった、名前のない不要なイメージたちを一掃してくれます。
  2. どのコンテナからも参照されていない: たとえdangling imageであっても、もしそのイメージを使っているコンテナが(たとえ停止中であっても)存在する場合、そのイメージは削除されません。Dockerは、コンテナが依存しているイメージを勝手に削除してしまわないように、安全に配慮してくれます。

実際に docker images コマンドでイメージ一覧を見てみましょう。

bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp latest c9b54b0b1464 5 minutes ago 950MB
<none> <none> a1b2c3d4e5f6 15 minutes ago 945MB <-- これがdangling image
<none> <none> f9e8d7c6b5a4 30 minutes ago 945MB <-- これもdangling image
ubuntu 22.04 1234abcd5678 2 weeks ago 77.8MB

この例では、REPOSITORYTAG<none> になっている2つのイメージがdangling imageです。docker image prune を実行すると、これら2つが削除対象となります。一方、myapp:latestubuntu:22.04 のように、ちゃんとタグが付いているイメージは、デフォルトの docker image prune では削除されません。

docker image prune はなぜ安全なのか?

Docker初心者が最も恐れるのは、「間違えて必要なものを消してしまうこと」ではないでしょうか。その点、docker image prune は、デフォルトの挙動が非常に慎重に設計されているため、初心者が最初に試すクリーンアップコマンドとして最適です。

安全と言える理由は以下の通りです。

  • 削除対象が限定的: 上述の通り、削除するのは基本的に「dangling image」のみです。あなたが意図してタグを付けたイメージ (myapp:v1.0 など) や、現在利用中のコンテナが参照しているイメージには手を出しません。
  • 事前の確認プロンプト: コマンドを実行すると、いきなり削除が始まるわけではありません。
    WARNING! This will remove all dangling images.
    Are you sure you want to continue? [y/N]

    (警告!これにより、すべてのdanglingイメージが削除されます。続行しますか?)
    という確認メッセージが表示されます。ここで y を入力しない限り、何も起こりません。この一手間が、誤操作を防ぐためのフェイルセーフとして機能します。

これらの特徴により、docker image prune は「とりあえず実行しても大きな問題は起きにくい、安全なコマンド」と言えます。開発中に「ちょっとビルドを繰り返しすぎたかな?」と感じたら、気軽にこのコマンドを実行して、こまめに不要なイメージを掃除する習慣をつけるのがおすすめです。

第3章: docker image prune の基本的な使い方

コマンドの役割と安全性が理解できたところで、いよいよ実際に docker image prune を使ってみましょう。ここでは、コマンド実行前の準備から、実行、そして結果の確認までをステップバイステップで解説します。

Step 1: 準備 – 削除対象のイメージを確認する

何事も、まずは現状把握から。いきなり削除コマンドを叩くのではなく、これから何が削除されるのかを事前に確認する癖をつけましょう。これはDocker運用における非常に良い習慣です。

dangling image、つまり docker image prune の削除対象となるイメージを確認するには、docker images コマンドに --filter (または -f) オプションを付けて実行します。

bash
docker images --filter "dangling=true"

あるいは、短縮して次のように書くこともできます。

bash
docker images -f "dangling=true"

このコマンドは、「dangling状態(dangling=true)のイメージだけを表示して」という意味になります。

実行例:

bash
$ docker images -f "dangling=true"
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a1b2c3d4e5f6 25 minutes ago 945MB
<none> <none> f9e8d7c6b5a4 40 minutes ago 945MB

もし、このコマンドを実行して何も表示されなければ、あなたの環境にはdangling imageが存在しないということです。その場合は、docker image prune を実行しても何も削除されません。

実行結果を見て、「うん、ここに表示されているイメージは確かに不要だな」と確認できたら、次のステップに進みます。

Step 2: コマンドの実行

いよいよ docker image prune を実行します。ターミナル(またはコマンドプロンプト)で、以下のコマンドを入力してください。

bash
docker image prune

コマンドを実行すると、前述の通り、確認メッセージが表示されます。

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

内容を確認し、問題なければ y を入力して Enter キーを押します。削除処理が実行されます。

Step 3: 実行結果の確認

削除が完了すると、どのような処理が行われたかの結果が表示されます。

実行結果の例:

“`
Deleted Images:
deleted: sha256:a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6
deleted: sha256:f9e8d7c6b5a4f9e8d7c6b5a4f9e8d7c6b5a4f9e8d7c6b5a4f9e8d7c6b5a4

Total reclaimed space: 1.89GB
“`

この結果から、以下のことがわかります。

  • Deleted Images:: 削除されたイメージのリストです。イメージID(ここでは sha256: から始まるハッシュ値)が表示されます。
  • Total reclaimed space:: 解放された合計ディスク容量です。この例では、約1.89GBのスペースが空いたことがわかります。この数値を見る瞬間は、なかなか爽快です。

本当にdangling imageが消えたか、念のため再度確認してみましょう。

bash
$ docker images -f "dangling=true"
REPOSITORY TAG IMAGE ID CREATED SIZE
$

今度は何も表示されません。無事にdangling imageが一掃されたことが確認できました。

もちろん、docker images で全イメージ一覧を表示しても、<none>:<none> の行が消えていることがわかります。

bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myapp latest c9b54b0b1464 15 minutes ago 950MB
ubuntu 22.04 1234abcd5678 2 weeks ago 77.8MB

スッキリしましたね!これが docker image prune の最も基本的な使い方です。

Tip: 確認メッセージをスキップする -f (--force) オプション

毎回 y を入力するのが少し手間に感じるかもしれません。特に、シェルスクリプトなどでクリーンアップ処理を自動化したい場合には、対話的な確認は邪魔になります。

そのような場合は、-f または --force オプションを使います。

bash
docker image prune -f

このコマンドは、確認メッセージを表示せずに、即座にdangling imageの削除を実行します。

ただし、手動で実行する際は、このオプションの利用は慎重になるべきです。たとえ安全なコマンドだとしても、「何が起きるか分かった上で、自分の意思で実行する」という意識を持つために、最初のうちは確認プロンプトに y と答える習慣をつけておくことをお勧めします。

第4章: もっと強力に削除!-a (--all) オプションの威力

基本的な docker image prune でdangling imageを掃除できるようになり、気分もディスクもスッキリしたことでしょう。しかし、しばらく開発を続けていると、また新たな問題に気づくかもしれません。

「dangling imageは消したはずなのに、docker images のリストはまだ長いままだし、ディスク容量もあまり改善しない…」

それもそのはず。第1章で触れたように、不要なイメージはdangling imageだけではないからです。過去に開発で使っていた myapp:v1.2myapp-fix-bug のような「タグ付きの古いイメージ」は、通常の prune では削除されません。

これらを含めて、もっと大胆に、そして強力にお掃除したい。そんな時に登場するのが -a (または --all) オプションです。

-a (--all) オプションの役割

docker image prune -a は、通常の prune とは削除の基準が異なります。

  • docker image prune (通常):
    dangling (タグ無し) のイメージを削除する。
  • docker image prune -a (--all):
    どのコンテナからも使われていないイメージを、タグの有無にかかわらず全て削除する。

これが決定的な違いです。「宙ぶらりんかどうか」ではなく、「誰からも必要とされていないかどうか」を基準に削除するのです。

これにより、以下のようなイメージも削除対象に含まれるようになります。

  • 過去のバージョンタグが付いたイメージ (例: myapp:v1.0, myapp:v1.1)
  • 開発途中で使ったフィーチャーブランチ名のタグが付いたイメージ (例: myapp-feature-login)
  • 現在は使っていないベースイメージ (例: 昔 ubuntu:20.04 を使っていたが、今は 22.04 に移行した、など)

docker builddocker run を繰り返す開発スタイルでは、停止したコンテナが古いイメージを参照し続けていることが多いため、docker image prune -a を実行する前に、不要なコンテナを削除 (docker container prunedocker rm) しておくと、より多くのイメージが削除対象になり、効果が高まります。(このあたりは第6章の docker system prune で詳しく解説します)

-a オプションの使い方と注意点

使い方は、prune コマンドに -a オプションを付けるだけです。

bash
docker image prune -a

実行すると、表示される警告メッセージも通常とは少し異なります。

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

(警告!これにより、コンテナに関連付けられていない全てのイメージが削除されます。続行しますか?)

「dangling」という単語が消え、「コンテナに関連付けられていない全てのイメージ」という、より強力な表現になっていることに注目してください。y を押して実行すると、未使用のイメージがごっそりと削除され、解放されるディスク容量も通常の prune より格段に大きくなる可能性があります。

実行前の最重要注意点

-a オプションは非常に強力な反面、意図しないイメージまで削除してしまうリスクも伴います。

例えば、あなたが DockerfileFROM ubuntu:22.04 のようにベースイメージを指定しているとします。この ubuntu:22.04 イメージは、イメージをビルドするためには必要ですが、ubuntu:22.04 から直接コンテナを起動していなければ、「未使用のイメージ」と見なされ、docker image prune -a によって削除されてしまいます。

削除されても大丈夫?

はい、基本的には大丈夫です。もし削除されてしまっても、次に docker build を実行した際に、Dockerは ubuntu:22.04 イメージがローカルにないことを検知し、自動的にDocker Hubから pull し直してくれます。

ただし、インターネット接続がない環境ではビルドできなくなりますし、イメージサイズが大きい場合は再ダウンロードに時間がかかり、開発のテンポが少し悪くなるかもしれません。

推奨される運用フロー

  1. docker ps -a でコンテナ一覧を確認し、不要な停止中コンテナを削除する。
  2. docker images でイメージ一覧を眺め、「このイメージは消えても、またビルド/プルすればいいな」「このイメージは残しておきたいな」と頭の中で整理する。
  3. docker image prune -a を実行して、未使用イメージを一掃する。

このひと手間をかけることで、「思ったより消えすぎた!」という事態を防ぎ、安心して強力なクリーンアップの恩恵を受けることができます。

実践的なシナリオ

docker image prune -a は、日常的に頻繁に使うコマンドというよりは、定期的な「大掃除」に最適です。

  • 週末や週の終わりに: 一週間の開発で溜まった不要なイメージを整理する。
  • プロジェクトの一区切りに: ある機能の開発が完了し、関連するイメージが不要になったタイミングで実行する。
  • ディスク容量が気になり始めたら: まずは通常の prune を試し、それでも不十分な場合に -a 付きで実行する。

このように、コマンドの特性を理解し、適切なタイミングで使い分けることが、賢いDockerユーザーへの第一歩です。

第5章: 特定の条件で削除する --filter オプション

docker image prune-a オプションをマスターすれば、ほとんどのケースでイメージの整理は事足ります。しかし、もっと高度で、もっときめ細やかな制御をしたい場面も出てくるでしょう。

「24時間以上使っていない、古いイメージだけを掃除したい」
「CI/CDで自動生成されたテスト用のイメージだけを削除したい」

そんなわがままな(しかし非常に実用的な)要求に応えてくれるのが --filter オプションです。このオプションを使うことで、削除対象となるイメージを、まるでデータベースを検索するように、特定の条件で絞り込むことができます。

--filter オプションの概要

--filter オプションは、key=value の形式で条件を指定します。

bash
docker image prune --filter "key=value"

このフィルターは複数指定することも可能で、その場合はAND条件として機能します。「条件A」と「条件B」の両方を満たすものだけが対象になります。

ここでは、特に便利な2つのフィルター untillabel を紹介します。

1. until フィルター: 時間で絞り込む

until フィルターは、「指定したタイムスタンプよりも前に作成された」イメージを削除対象にします。これにより、「古いイメージだけを掃除する」という、非常にスマートな運用が可能になります。

タイムスタンプは、Unixタイムスタンプのほか、24h (24時間) や 10m (10分) のような人間が読みやすい形式で指定できます。

使用例1: 24時間以上前のdangling imageを削除

bash
docker image prune --filter "until=24h"

このコマンドは、通常の prune (dangling imageが対象) に、「作成から24時間以上経過している」という条件を追加します。昨日ビルドしたばかりのdangling imageは残しつつ、それより古いものだけを掃除できます。

使用例2: 1週間(168時間)以上前の未使用イメージを全て削除

-a オプションと組み合わせると、さらに強力になります。

bash
docker image prune -a --filter "until=168h"

これは、「作成から1週間以上経過しており、かつ、どのコンテナからも使われていないイメージを、タグの有無にかかわらず全て削除する」というコマンドです。

このコマンドは、定期的な自動クリーンアップスクリプトに組み込むのに最適です。例えば、毎週月曜の早朝にこのコマンドを自動実行するように設定しておけば、開発者が意識することなく、常にDocker環境をクリーンに保つことができます。直近1週間で使ったイメージは残るため、開発効率を損なうこともありません。

2. label フィルター: ラベルで絞り込む

label フィルターは、イメージに付けられた「ラベル」を基に削除対象を絞り込みます。

Dockerイメージには、DockerfileLABEL 命令を使って、任意のキーと値のペア(メタデータ)を付与することができます。

Dockerfileの例:

“`dockerfile
FROM ubuntu:22.04

ビルドステージや管理者などの情報をラベルとして付与

LABEL stage=”test”
LABEL maintainer=”[email protected]
LABEL project.version=”1.0″
“`

このようにラベルを付けておくことで、イメージの管理が格段にしやすくなります。そして、prune コマンドでこのラベルを利用できるのです。

使用例1: stage=test ラベルが付いた未使用イメージを削除

CI/CDパイプラインで、テスト実行のためだけに一時的なイメージをビルドすることがよくあります。これらのイメージには stage=test のようなラベルを付けておき、テスト完了後に一括でクリーンアップします。

bash
docker image prune -a --filter "label=stage=test"

使用例2: 特定のラベルが付いていないイメージだけを削除

逆に、「このイメージは重要だから絶対に消したくない」という場合もあります。そのようなイメージには、目印となるラベルを付けておき、それを除外条件とすることができます。label!=value のように != を使います。

例えば、preserve=true (preserve=保存する) というラベルを付けたイメージは削除しないようにしてみましょう。

bash
docker image prune -a --filter "label!=preserve=true"

このコマンドは、「preserve=true というラベルが付いていない、未使用のイメージ」を全て削除します。これにより、重要なベースイメージや、頻繁に使うデバッグ用イメージなどを、prune の対象から安全に除外できます。

filter の組み合わせで、さらに高度な制御を

複数の --filter を組み合わせることで、より複雑な条件を指定できます。

例: 作成から10日以上経過していて、かつ、保存ラベルが付いていない、未使用のイメージを全て削除

bash
docker image prune -a --filter "until=240h" --filter "label!=preserve=true"

ここまで使いこなせれば、あなたはもう単なるDockerユーザーではなく、Docker環境を自在に管理する「Dockerマイスター」と言えるでしょう。--filter は、あなたのイメージ管理戦略を、一段上のレベルへと引き上げてくれる強力な武器なのです。

第6章: イメージだけじゃない!Dockerシステム全体のお掃除 docker system prune

ここまで、docker image prune を使ったイメージの掃除方法を徹底的に解説してきました。しかし、ディスク容量を消費している犯人は、本当にイメージだけでしょうか?

実は、Docker環境にはイメージ以外にも、知らず知らずのうちに溜まっていく「ゴミ」が存在します。

  • 停止したコンテナ (Exited 状態のコンテナ): docker run で一度起動したコンテナは、処理が終わると停止しますが、削除しない限り残り続けます。これらも微量ながらディスクを消費し、docker ps -a の一覧を長くする原因になります。
  • 未使用のネットワーク: コンテナを連携させるために作成したカスタムネットワークは、コンテナを削除しても自動では消えずに残ることがあります。
  • 未使用のボリューム: データベースのデータなどを永続化するために使われるボリュームは、最も注意が必要な存在です。コンテナを削除しても、データを保護するためにボリュームは意図的に残されます。しかし、本当に不要になったボリュームが溜まっていくと、大きな容量を占めることがあります。
  • ビルドキャッシュ: docker build を高速化するためのキャッシュも、ディスク容量を消費します。

これらの「イメージ以外の不要物」もまとめて一掃してくれる、究極のお掃除コマンドが docker system prune です。

docker system prune の役割

docker system prune は、その名の通り、Dockerの「システム」全体を対象に剪定(prune)を行います。このコマンド一発で、以下のものがクリーンアップされます。

  1. 停止している全てのコンテナ
  2. どのコンテナからも使われていない全てのネットワーク
  3. 全てのdanglingイメージ
  4. 全てのビルドキャッシュ

注目すべきは、docker image prune の機能(dangling imageの削除)を内包している点です。イメージだけでなく、停止したコンテナや不要なネットワークも同時に掃除してくれるため、非常に効率的です。

docker system prune の使い方と注意点

使い方は非常にシンプルです。

bash
docker system prune

実行すると、削除対象となるリソースの種類がリストアップされた、物々しい警告メッセージが表示されます。

“`
WARNING! This will remove:
– all stopped containers
– all networks not used by at least one container
– all dangling images
– all build cache

Are you sure you want to continue? [y/N]
“`

y を押して実行すると、これらのリソースが一括で削除され、多くの場合、かなりのディスク容量が解放されます。

注意点: このコマンドは「停止しているコンテナを全て削除」します。もし「後でログを確認しよう」とか「ちょっと再起動して試したい」と思っていた停止コンテナがあったとしても、問答無用で削除されてしまいます。実行する前に、必ず docker ps -a で停止中のコンテナ一覧を確認し、残しておきたいものがないかチェックする習慣をつけましょう。

さらに強力なオプション: -a--volumes

docker system prune にも、さらに強力なオプションが存在します。

docker system prune -a

image prune の場合と同様に、-a (--all) オプションは削除対象を広げます。

docker system prune -a は、通常の system prune の機能に加えて、

  • 未使用のイメージ(danglingだけでなく、タグ付きも含む)を全て削除

します。つまり、docker image prune -a の機能も取り込んだ、さらに強力なコマンドです。これも同様に、停止コンテナが削除された結果、未使用と見なされるイメージが増えるため、非常に高い効果が期待できます。

docker system prune --volumes (最重要注意!)

これが、Dockerのお掃除コマンドの中で、最も強力かつ、最も危険なオプションです。

docker system prune --volumes は、system prune の機能に加えて、

  • どのコンテナからも使われていないボリュームを全て削除

します。

なぜ危険なのでしょうか?ボリュームは、アプリケーションが生成する永続化データ(データベースファイル、ユーザーがアップロードしたファイルなど)を保存するために使われるからです。つまり、このオプションはデータを削除する可能性があるのです。

もちろん、「どのコンテナからも使われていない」ボリュームだけが対象なので、現在稼働中のコンテナが使っているデータが消えることはありません。しかし、開発環境で一時的にコンテナを削除しただけで、データは後で使うつもりだった、というようなケースで、意図せずデータを失ってしまうリスクがあります。

このコマンドを実行する前には、必ず docker volume ls コマンドでボリューム一覧を確認し、そこに表示されているものが本当に不要なものか、一つ一つ確認してください。 データの消失は、イメージの再ビルドのように簡単には取り返しがつきません。

どの prune コマンドをいつ使えばいいか?

ここまで4つの主要な prune コマンド(とオプション)を紹介しました。最後に、それぞれの使い分けの指針をまとめます。

コマンド 目的 タイミング 安全性
docker image prune 日常的な軽い掃除
dangling imageの削除
開発中、buildを繰り返した後など、気軽に ★★★★★ (高)
docker image prune -a 定期的な中掃除
未使用のタグ付きイメージも整理
プロジェクトの一区切り、週末など ★★★★☆ (中高)
docker system prune 徹底的な大掃除
停止コンテナやキャッシュも一掃
ディスクが逼迫した時、クリーンな状態にしたい時 ★★★☆☆ (中)
docker system prune --volumes 環境のリセット(最終手段)
未使用ボリューム(データ)も削除
環境を初期化したい時。データ消失リスクを理解した上で ★☆☆☆☆ (低)

この表を参考に、自分の目的と状況に合わせて、最適な prune コマンドを選択してください。

第7章: よくある質問 (FAQ)

ここでは、docker image prune に関する初心者が抱きがちな疑問について、Q&A形式でお答えします。

Q1: docker image prune で必要なイメージまで消してしまいました。元に戻せますか?

A: 残念ながら、一度 prune で削除したイメージを直接元に戻す(undeleteする)機能はありません。しかし、パニックになる必要はありません。Dockerイメージの多くは「再生成可能」です。

  • Docker Hubなどの公式イメージの場合: ubuntu:22.04nginx:latest のようなイメージであれば、docker pull ubuntu:22.04 のように、docker pull コマンドで再度ダウンロードすれば元通りになります。
  • 自分でビルドしたイメージの場合: Dockerfile とソースコードが手元にあれば、docker build コマンドを実行すれば、全く同じイメージを再作成できます。

重要なのは、イメージそのものではなく、イメージを生成するための Dockerfile やソースコードをバージョン管理しておくことです。それさえあれば、イメージはいつでも復元可能です。

Q2: docker rmi $(docker images -f "dangling=true" -q) というコマンドをネットで見かけました。これと docker image prune は何が違うのですか?

A: 素晴らしい質問です。この2つのコマンドが実行する内容は、基本的に同じです。どちらも「dangling imageを全て削除する」という処理を行います。

  • docker rmi $(docker images -f "dangling=true" -q):
    これは、古くから使われている方法です。docker images -f "dangling=true" -q でdangling imageのID一覧を取得し、それを docker rmi コマンド(イメージを削除するコマンド)に渡して、一つずつ削除しています。シェルのコマンド置換機能を使ったテクニックです。
  • docker image prune:
    これは、Dockerが公式に提供している、より新しく、より洗練された専用コマンドです。

では、なぜ docker image prune を使うべきなのでしょうか?

  • 意図が明確: コマンド名が image prune(イメージの剪定)なので、何をするかが一目瞭然です。
  • クロスプラットフォーム: WindowsのPowerShellなど、一部の環境では $(...) のようなコマンド置換がうまく機能しない場合があります。docker image prune はDocker自体のコマンドなので、どのOSでも同じように動作します。
  • シンプル: タイプする文字数が少なく、覚えやすいです。

結論として、現在では docker image prune を使うことが強く推奨されます。

Q3: docker image prune を実行しても、あまり容量が空きません。なぜですか?

A: いくつかの理由が考えられます。

  1. そもそもdangling imageが少なかった: docker image prune はdangling imageしか削除しません。もし、ディスクを圧迫している原因がタグ付きの未使用イメージであれば、docker image prune -a を試す必要があります。
  2. 原因はイメージではなかった: ディスク容量を圧迫している真犯人が、イメージではなく、停止したコンテナ、ビルドキャッシュ、あるいは未使用のボリュームである可能性があります。この場合は、docker system prune を試してみてください。解放される容量に驚くかもしれません。
  3. イメージが(停止した)コンテナから参照されていた: たとえdangling imageであっても、そのイメージを使っているコンテナが1つでも存在すれば(停止していても)、prune の対象外となります。まずは docker container prunedocker system prune で不要なコンテナを掃除してから、再度 docker image prune -a を実行すると、多くのイメージが削除できるようになります。

Q4: docker image prune は安全ですか?本番環境で実行しても大丈夫ですか?

A: デフォルトの docker image prune は、dangling imageのみを削除するため、比較的安全なコマンドと言えます。稼働中のコンテナが使っているイメージに影響を与えることはありません。

しかし、「本番環境」での操作は、常に最大限の注意を払うべきです。

  • -a オプションは特に注意: 本番環境で docker image prune -a を実行すると、現在稼働中のコンテナが使っていないイメージは全て削除されます。もし、フェイルオーバーやスケールアウトのために待機させているイメージがあった場合、それも削除される可能性があります。いざという時にイメージの再ダウンロードが必要になり、復旧が遅れるリスクを考慮する必要があります。
  • 実行タイミング: もし実行するのであれば、システムの負荷が低い時間帯(深夜など)に行うのが賢明です。
  • 事前確認: 実行前に、どのようなイメージが削除対象になるかを --filter などを使って確認し、チーム内で合意を取ることが重要です。

基本的には、本番環境でのクリーンアップは、CI/CDプロセスに組み込むなど、自動化され、テストされた手順で行うのが理想です。手動で安易に prune コマンドを実行するのは避けた方が良いでしょう。

まとめ

長い旅路でしたが、これであなたはDockerのディスク容量問題に立ち向かうための強力な知識とツールを手に入れました。

最後に、この記事で学んだ重要なポイントを振り返りましょう。

  • イメージは増えるもの: docker builddocker pull を繰り返すことで、タグのない「dangling image」や、古いバージョンのタグ付きイメージが自然と溜まっていく。
  • docker image prune は基本の「き」: dangling imageを安全かつ簡単に削除できる、初心者にとって最初の味方となるコマンド。
  • docker image prune -a は強力な味方: タグの有無にかかわらず、どのコンテナからも使われていないイメージを一掃し、大幅なディスクスペースを解放してくれる。
  • --filter は上級者の武器: untillabel といった条件で削除対象を細かく制御し、スマートなイメージ管理を実現する。
  • docker system prune は最終兵器: イメージだけでなく、停止コンテナやネットワーク、キャッシュなど、システム全体をまとめて大掃除してくれる。ただし、--volumes オプションの使用はデータ消失のリスクを伴うため、最大限の注意が必要。

Dockerは、現代のアプリケーション開発に欠かせない素晴らしい技術です。しかし、その力を最大限に引き出すためには、ただ使うだけでなく、日々のメンテナンスも重要になります。

今日学んだ prune コマンドをあなたの武器に加え、定期的にDocker環境の「剪定」を行う習慣を身につけてください。そうすれば、ディスク容量の心配から解放され、よりクリーンで、より快適なDockerライフを送ることができるはずです。

Happy Dockering

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール