Docker イメージの削除: すべて, 強制, なし タグ, キャッシュ, Docker Hub
この記事では、Dockerイメージの削除に関する7つのポイントを取り上げます。
ここでは docker image rm
コマンドを中心に、特定のイメージの削除、強制削除、完全削除、未使用イメージの削除、dagの削除、ビルドキャッシュの削除、さらにはdocker hubイメージの削除など、ほぼ全てのタイプのdockerイメージの削除方法について説明します。
1. Docker 固有のイメージ削除コマンド
Dockerから1つ以上のイメージを削除するコマンドの基本フォーマットは以下の通りです。
docker image rm [OPTIONS] IMAGE [IMAGE...]
これは古いコマンドスキームの docker rmi
コマンドのように動作し、画像の名前、名前とタグ、画像IDを IMAGE
の位置に指定します。
利用可能なオプションには、強制的に削除する --force
と、親イメージを削除しない --no-prune
があります。
Dockerから特定のイメージを削除するには、そのイメージが現在実行中のコンテナで使用されていない必要があります。 そのため、そのようなイメージに対して以下のコマンドを実行することで、イメージを削除することができます。
最新バージョンのnginxイメージを削除したい場合は、以下のコマンドを実行します。
$ docker image rm nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Deleted: sha256:f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
Deleted: sha256:419f8948c50c723f2a5ac74428af3d804b5d0079d6df8f7f827663cf10cbc366
Deleted: sha256:1030aac4f1a8096ed58d3d4a2df55dd1b1b27d919ad156d97ad1f68081d0051a
Deleted: sha256:7d90b49d96c3036539ef144ecc27c01de03902d8ea166a0f7b77d11d3779c4bd
Deleted: sha256:551acb210764654af31b6cd51adaa74edc9a202587c3395fe0e9f95a2e097f8b
Deleted: sha256:3c530958db4c75c6fb409f339367aaf9a1e163c84718c035d4b09bebc83f43e7
Deleted: sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3
上図のように画像名で削除することも、下図のように画像IDで削除することもできます。
$ docker image ls ubuntu:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3b418d7b466a 5 weeks ago 77.8MB
$ docker image rm 3b418d
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e47492599ee20739e8eb54fbf
Deleted: sha256:3b418d7b466ac6275a6bfcb0c86fbe4422ff6ea0af444a294f82d3bf5173ce74
Deleted: sha256:b8a36d10656ac19ddb96ef3107f76820663717708fc37ce929925c36d1b1d157
2. イメージの強制削除
セクション1で簡単に触れましたが、Dockerイメージを削除できない主なケースが3つあります。
これらのケースでは --force
オプションを使って強制的に削除する必要があります。削除できない3つのケースを見てみましょう。
2.1. Dockerイメージの削除に失敗する場合
- 実行中のコンテナでイメージが使用されている: デフォルトでは、Dockerは実行中/停止中のコンテナによって使用されているイメージを削除することはできません。 このようなイメージを削除するには、まずそのコンテナを停止または削除する必要があります。
- イメージは別のイメージの親です: Dockerイメージはレイヤーの集合体であり、あるイメージが別のイメージのベースになることがあります。 この場合、基になるイメージを削除しようとすると、その操作は拒否されます。この問題を解決するには、まず依存するイメージをすべて削除する必要があります。
- Dockerのディスク容量が不足しています: イメージを削除する過程で、Dockerが一時的に追加のディスク領域を使用することがあります。 ディスク容量が不足すると、イメージの削除に失敗する可能性があります。
このような場合は、問題を解決してからイメージの削除を再試行してください。たとえば、実行中のコンテナを停止または削除したり、親イメージを使用している子イメージを削除したり、必要に応じてディスク領域を確保したりします。
しかし、場合によっては、状況を解決しようとして多くの時間と費用を浪費することになるかもしれません。開発用や不測の事態に対応するために使用しているのであれば、強制削除を進めた方がよいでしょう。
2.2. 画像を強制的に削除する方法
画像の強制削除は簡単です。rm
コマンドに--force
オプションを追加するだけです。
以下は、停止したコンテナで使用されているイメージである。強制削除の結果を見てみよう。
$ docker image rm php:7
Error response from daemon: conflict: unable to remove repository reference "php:7" (must force) - container 086591af79a4 is using its referenced image 0b50b7a54cab
$.docker image rm --force php:7
Untagged: php:7
Untagged: php@sha256:a4325b962bf0ced295f9f6ea275837f504109fcb8497cb0fd340094bc5b5f29f
Deleted: sha256:0b50b7a54cab40ebbb65919b3502dbff938bbdaa6c4e18339d73745fc73ccdf5
通常の削除ではエラーが出ましたが、強制削除では正常に完了しました。
3. 未使用のイメージを完全に削除する (none)
複数のDockerイメージをダウンロードしたり、自分でカーネルイメージをビルドしたりすると、自然と <none>
というイメージ名のイメージが溜まっていきます。
これらはイメージのビルド速度や出力サイズを最適化するために作成された中間イメージです。
これらはほとんどの場合、未使用のイメージです。
Dockerはこれらのぶら下がったイメージを一度に削除するコマンドを提供しています。これを docker image prune
と呼ぶ。
現在、リストには以下のように多くの <none>
イメージが表示されています。
prune`コマンドを入力してプロンプトにyesと答えると、以下のように削除が進みます。
このプロセスで削除されなかったイメージがある場合は、セクション2.1で見た3つの理由のうちの1つである可能性が高いです。
4. すべての画像を完全に削除する
これは推奨されませんが、ローカル環境にあるすべての画像を、その状態に関わらず完全に削除したい場合は、以下の方法を使うことができます。
$ docker image rm --force $(docker image ls --all --quiet)
docker image ls --all --quiet
コマンドは単純にローカル環境にある全てのイメージ ID のリストを表示します。シェルスクリプトの $()
構文は、この ID のリストを直前のコマンドの引数として渡すために使用します。
rm
コマンドには --force
オプションがあり、どのような状態の画像でも削除することができます。
誤って重要な画像を削除してしまわないように、これらのコマンドを使う前に必ず画像のバッ クアップを行ってください。
5. 画像タグの削除
画像タグを削除するコマンドは docker image rm
です。何かおかしいと思ったら、その通りです。
これは特定のイメージを削除するコマンドと同じで、Dockerにはタグを削除するコマンドは別に用意されていません。
Dockerでは、イメージに複数のタグがある場合にのみ、イメージのタグを削除できます。 イメージに他のタグがない場合、イメージ全体が削除されます。しかし、画像に他のタグが複数ある場合は、コマンドで指定したタグだけが削除され、画像はまだ存在します。
これを実際に見るために、Nginxの画像に新しいタグを追加してみましょう。イメージに新しいタグを追加するには、 docker image tag
コマンドを使います。
$ docker image tag nginx:latest nginx:my-tag
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f9c14fe76d50 6 days ago 143MB
nginx my-tag f9c14fe76d50 6 days ago 143MB
nginx:latest
画像にmy-tag
という新しいタグを追加し、ls
コマンドを実行すると、同じ画像IDを持つ2つのタグが表示されます。
my-tag
タグを削除してみよう。
$ docker image rm nginx:my-tag
Untagged: nginx:my-tag
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f9c14fe76d50 6 days ago 143MB
nginx 1.21 f8f4ffc8092c 20 months ago 133MB
問題のNginx画像には複数のタグがあったため、タグだけが削除され、画像はまだ存在していることがわかります。
同様に、画像のタグを変更するには、画像を削除して新しいタグで同じ画像を作り直します。 あるいは、新しいタグを追加して、既存のタグを画像から削除することもできます。
Dockerイメージのタグを削除すると、そのタグに関連するイメージを見つけられなくなるので、削除する前にイメージに他のタグがあるかどうかを確認することが重要です。
6. イメージのビルドキャッシュをクリアする
Dockerがイメージをビルドするとき、中間ステップの結果をキャッシュとして保存し、次回ビルド時に再利用します。 このキャッシュはディスク容量を消費するので、必要に応じてクリアしてください。
Dockerのビルドキャッシュをクリアするには、docker builder prune'
コマンドを使います:
このコマンドは未使用のビルドキャッシュを全て削除します。既存のビルドキャッシュを全て削除したい場合は、--all
オプションを付けて実行します。
キャッシュを削除するとローカル環境のディスク容量が増えますが、画像のビルド時間が長くなる可能性もあります。 このトレードオフを考えながらコマンドを実行するのは良いプロセスです。
7. Docker Hubイメージを削除する
以下はDocker Hubからイメージを削除する手順です。
- Docker Hubにログインします。
- Repositoriesをクリックします。
- 削除したいイメージを含むリポジトリをクリックします。
- Tagsタブに移動します。
- 削除したいタグの右にある削除ボタンをクリックします。
- ポップアップウィンドウで、Deleteをクリックしてタグを削除するか、Delete All Tagsをクリックしてリポジトリ内のすべてのタグを削除します。
注:Docker Hubからイメージを削除すると、そのイメージはDocker Hubから永久に削除されます。 復元することはできませんので、削除する前に必要に応じてバックアップすることをお勧めします。
8. 最後に
この投稿では、Dockerイメージの削除に関する7つのポイントを説明しました。 特に、特定のイメージの削除、強制削除、完全削除、未使用イメージの削除、ダグの削除、ビルドキャッシュの削除、さらにはDocker Hubイメージの削除など、ほぼすべてのタイプのイメージ削除方法を取り上げました。 あなたのDockerイメージ削除作業のお役に立てれば幸いです。
