1. 序章

前回の記事で、DockerイメージとDockerコンテナーの違いについて説明しました。 つまり、イメージはJavaクラスのようなものであり、コンテナーはJavaオブジェクトのようなものです。

このチュートリアルでは、Dockerイメージを削除するさまざまな方法を見ていきます。

2. Dockerイメージを削除する理由

Docker Engineはイメージを保存し、コンテナーを実行します。そのために、 Docker Engineは、イメージ、コンテナー、およびその他すべての「ストレージプール」として一定量のディスクスペースを予約します(グローバルDockerボリュームやネットワークなど)。

そのストレージプールがいっぱいになると、Dockerエンジンは機能しなくなります。新しいイメージを作成またはダウンロードできなくなり、コンテナーが実行できなくなります。

DockerイメージはDockerエンジンストレージプールの大部分を占めます。 そのため、 Dockerイメージを削除して、Dockerを実行し続けます

また、イメージを削除して、Dockerエンジンを整理してクリーンに保ちます。 たとえば、開発中に、すぐに不要になった数十の画像を簡単に作成できます。 または、後で破棄できるテスト用のソフトウェアイメージをダウンロードします。

DockerリポジトリからプルしたDockerイメージを簡単に削除できます:再び必要になった場合は、リポジトリからもう一度プルします。

ただし、自分で作成したDockerイメージには注意する必要があります。 削除したら、o 保存しない限り、自分の画像は消えてしまいます。 Dockerイメージをリポジトリにプッシュするか、 それらをTARファイルにエクスポートする

3. PostgreSQL13ベータ画像のダウンロード

PostgreSQLはオープンソースのリレーショナルデータベースです。 例として、最初の2つのPostgreSQL13ベータDockerイメージを使用します。 これらの2つの画像は比較的小さいため、すばやくダウンロードできます。 また、これらはベータソフトウェアであるため、Dockerエンジンにはまだ含まれていません。

ベータ2イメージを使用してコンテナを作成します。 ベータ1イメージを直接使用することはありません。

ただし、これら2つのイメージをダウンロードする前に、まず、Dockerイメージがストレージプールで占めるスペースを確認しましょう。

docker system df --format 'table {{.Type}}\t{{.TotalCount}}\t{{.Size}}'

これがテストマシンからの出力です。 最初の行は、71個のDockerイメージが7.8GBを使用していることを示しています。

TYPE                TOTAL               SIZE
Images              71                  7.813GB
Containers          1                   359.1MB
Local Volumes       203                 14.54GB
Build Cache         770                 31.54GB

次に、2つのPostgreSQLイメージをダウンロードし、Dockerストレージプールを再確認します。

docker pull postgres:13-beta1-alpine
docker pull postgres:13-beta2-alpine
docker system df --format 'table {{.Type}}\t{{.TotalCount}}\t{{.Size}}'

予想通り、画像数は71枚から73枚に増えました。 そして、全体的な画像サイズは7.8GBから8.1GBになりました。

簡潔にするために、最初の行を表示します。

TYPE                TOTAL               SIZE
Images              73                  8.119GB

4. 単一の画像の削除

PostgreSQL13ベータ2イメージでコンテナを開始しましょう。 secr3t をデータベースrootユーザーのパスワードとして設定します。これは、PostgreSQLコンテナーがパスワードなしでは起動しないためです。

docker run -d -e POSTGRES_PASSWORD=secr3t postgres:13-beta2-alpine
docker ps --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'

テストマシンで実行されているコンテナは次のとおりです。

CONTAINER ID        IMAGE                      STATUS
527bfd4cfb89        postgres:13-beta2-alpine   Up Less than a second

それでは、PostgreSQL13ベータ2イメージを削除しましょう。 docker image rmを使用して、Dockerimageを削除します。 このコマンドは、1つ以上の画像を削除します。

docker image rm postgres:13-beta2-alpine

実行中のコンテナが引き続きそのイメージを使用しているため、このコマンドは失敗します。

Error response from daemon: conflict: unable to remove repository reference "postgres:13-beta2-alpine" (must force) - container 527bfd4cfb89 is using its referenced image cac2ee40fa5a

それでは、 docker ps から取得したIDを使用して、実行中のコンテナーを停止しましょう。

docker container stop 527bfd4cfb89

ここで、イメージを再度削除しようとすると、同じエラーメッセージが表示されます:実行中かどうかにかかわらず、コンテナで使用されているイメージを削除できません

それでは、コンテナを削除しましょう。 その後、最終的に画像を削除できます。

docker container rm 527bfd4cfb89
docker image rm postgres:13-beta2-alpine

Docker Engineは、イメージ削除の詳細を出力します。

Untagged: postgres:13-beta2-alpine
Untagged: postgres@sha256:b3a4ebdb37b892696a7bd7e05763b938345f29a7327fc17049c7148c03ff6a92
removed: sha256:cac2ee40fa5a40f0abe53e0138033fe7a9bcee28e7fb6c9eaac4d3a2076b1a86
removed: sha256:6a14bab707274a8007da33fe08ea56a921f356263d8fd5e599273c7ee4880170
removed: sha256:5e6ef40b9f6f8802452dbca622e498caa460736d890ca20011e7c79de02adf28
removed: sha256:dbd38ed4b347c7f3c81328742a1ddeb1872ad52ac3b1db034e41aa71c0d55a75
removed: sha256:23639f6bd6ab4b786e23d9d7c02a66db6d55035ab3ad8f7ecdb9b1ad6efeec74
removed: sha256:8294c0a7818c9a435b8908a3bcccbc2171c5cefa7f4f378ad23f40e28ad2f843

dockerシステムdfは、削除を確認します。画像の数が73から72に減少しました。 そして、全体的な画像サイズは8.1GBから8.0GBになりました。

TYPE                TOTAL               SIZE
Images              72                  7.966GB

5. 名前による複数の画像の削除

前のセクションで削除したPostgreSQL13ベータ2イメージをもう一度ダウンロードしてみましょう。

docker pull postgres:13-beta2-alpine

ここで、ベータ1イメージとベータ2イメージの両方を名前で削除します。 これまで、ベータ2イメージのみを使用してきました。 前述のように、ベータ1イメージを直接使用していないため、今すぐ削除できます。

残念ながら、 docker image rm には、名前で削除するためのフィルターオプションがありません。 代わりに、 Linuxコマンドをチェーンして、名前で複数のイメージを削除します。

docker pull コマンドのように、リポジトリとタグで画像を参照します。リポジトリは postgres 、ラベルは13-beta1-alpine13-beta2-alpine

したがって、名前で複数の画像を削除するには、次のことを行う必要があります。

  • postgres:13-beta2-alpine など、リポジトリとタグごとにすべての画像を一覧表示します
  • 次に、grepコマンドを使用して正規表現でこれらの出力行をフィルタリングします。^postgres:13-beta
  • そして最後に、それらの行を docker imagermコマンドにフィードします

これらをまとめ始めましょう。 正確さをテストするために、これらのピースの最初の2つだけを実行してみましょう。

docker image ls --format '{{.Repository}}:{{.Tag}}' | grep '^postgres:13-beta'

そして、私たちのテストマシンでは、次のようになります。

postgres:13-beta2-alpine
postgres:13-beta1-alpine

これで、 docker imagermコマンドに追加できます。

docker image rm $(docker image ls --format '{{.Repository}}:{{.Tag}}' | grep '^postgres:13-beta')

以前と同様に、実行中または停止中のコンテナがイメージを使用していない場合にのみ、イメージを削除できます。 次に、前のセクションと同じ画像削除の詳細が表示されます。 また、 docker system df は、テストマシンで7.8GBの画像が71枚に戻ったことを示しています。

TYPE                TOTAL               SIZE
Images              71                  7.813GB

このイメージ削除コマンドは、LinuxおよびMacのターミナルで機能します。 Windowsでは、 DockerToolboxの「Dockerクイックスタートターミナル」が必要です。 将来的には、最新の Docker Desktop for Windows は、Windows10でもこのLinuxコマンドで動作する可能性があります

6. サイズによる画像の削除

ディスクスペースを節約する優れた方法は、最初に最大のDockerイメージを削除することです。

docker imagelsもサイズで並べ替えることができなくなりました。 したがって、すべての画像を一覧表示し、その出力をsortコマンドで並べ替えて、画像をサイズで表示します

docker image ls | sort -k7 -h -r

テストマシンの出力:

collabora/code   4.2.5.3         8ae6850294e5   3 weeks ago  1.28GB
nextcloud        19.0.1-apache   25b6e2f7e916   6 days ago   752MB
nextcloud        latest          6375cff75f7b   5 weeks ago  750MB
nextcloud        19.0.0-apache   5c44e8445287   7 days ago   750MB

次に、手動で確認して、削除するものを見つけます。 IDの3列目は、リポジトリとタグの1列目と2列目よりもコピーと貼り付けが簡単です。 Dockerを使用すると、一度に複数のイメージを削除できます。

nextcloud:latestnextcloud:19.0.0-apacheを削除したいとします。 簡単に言えば、テーブル内の対応するIDを確認し、 docker imagermコマンドにリストすることができます。

docker image rm 6375cff75f7b 5c44e8445287

以前と同様に、どのコンテナでも使用されていない画像のみを削除でき、通常の画像削除の詳細を確認できます。 これで、テストマシンで7.1GBの画像が69枚になりました。

TYPE                TOTAL               SIZE
Images              69                  7.128GB

7. 作成日による画像の削除

Dockerは作成日までに画像を削除できます。 そのために、新しい docker imagepruneコマンドを使用します。 docker image rm とは異なり、複数の画像またはすべての画像を削除するように設計されています。

それでは、2020年7月7日より前に作成されたすべての画像を削除しましょう。

docker image prune -a --force --filter "until=2020-07-07T00:00:00"

それでも、どのコンテナでも使用されていない画像のみを削除でき、通常の画像削除の詳細が表示されます。 このコマンドは、テストマシンで2つのイメージを削除したため、テストマシンでは67イメージと5.7GBになります。

TYPE                TOTAL               SIZE
Images              67                  5.686GB

作成日までに画像を削除する別の方法は、カットオフ日の代わりに期間を指定することです。 1週間以上前のすべての画像を削除したいとします。

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

Dockerフィルターオプションでは、その期間を時間に変換する必要があることに注意してください。

8. コンテナと画像の剪定

docker image prune未使用の画像を一括削除します。 これは、 docker container pruneと連携し、停止したコンテナーを一括で削除します。 その最後のコマンドから始めましょう:

docker container prune

これにより、警告メッセージが出力されます。 y と入力し、Enterを押して続行する必要があります。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
removed Containers:
1c3be3eba8837323820ecac5b82e84ab65ad6d24a259374d354fd561254fd12f

Total reclaimed space: 359.1MB

したがって、テストマシンでは、これにより1つの停止したコンテナが削除されました。

次に、画像の関係について簡単に説明する必要があります。 Dockerイメージは、Javaクラスが他のJavaクラスを拡張するのと同じように、他のイメージを拡張して機能を取得します。

PostgreSQLベータ2イメージDockerfileの上部を見て、拡張されているイメージを確認しましょう。

FROM alpine:3.12

したがって、ベータ2イメージは alpine:3.12を使用します。 そのため、最初にベータ2イメージをプルしたときに、Dockerが alpine:3.12を暗黙的にダウンロードしました。 docker imagelsでこれらの暗黙的にダウンロードされた画像は表示されません。

ここで、PostgreSQL13ベータ2イメージを削除したとしましょう。 他のDockerイメージがalpine:3.12 を拡張していない場合、Dockerは alpine:3.12をいわゆる「ぶら下がりイメージ」と見なします。 docker image pruneは、これらのぶら下がっている画像を削除します:

docker image prune

このコマンドでは、 y と入力し、Enterを押して続行する必要もあります。

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

テストマシンでは、これによってイメージが削除されることはありませんでした。

docker image prune -aは、containersで使用されていないすべてのイメージを削除します。 したがって、コンテナがない場合(実行中かどうかに関係なく)、これによりすべてのDockerイメージが削除されます! それは確かに危険なコマンドです:

docker image prune -a

テストマシンでは、これによりすべての画像が削除されました。 docker system df は、コンテナーもイメージも残っていないことを確認します。

TYPE                TOTAL               SIZE
Images              0                   0B
Containers          0                   0B

9. コンテナと画像を強制的に削除する

docker prune コマンドは、停止したコンテナーとぶら下がっているイメージを削除します。 しかし、マシンからすべてのDockerイメージを削除したい場合はどうでしょうか。 このためには、最初にマシンで実行されているすべてのDockerコンテナーを削除してから、Dockerイメージを削除する必要があります。

docker rm -f $(docker ps -qa)

このコマンドは、すべてのコンテナを削除します。 -f フラグは、実行中のDockerコンテナーを強制的に削除するために使用されます。

docker rmi コマンドを使用して、すべてのDockerイメージを削除しましょう。

docker rmi -f $(docker images -aq)

docker images -qa は、すべてのDockerイメージのイメージIDを返します。 docker rmi コマンドは、すべての画像を1つずつ削除します。 ここでも、 -f フラグを使用して、Dockerイメージを強制的に削除します。

すべてのDockerコンテナーが既にマシンから削除されているため、 docker image prune コマンドを使用して、すべてのDockerイメージを削除することもできます。

10. 結論

この記事では、最初に単一のDockerイメージを削除する方法を説明しました。 次に、名前、サイズ、または作成日で画像を削除する方法を学びました。 最後に、未使用のコンテナとイメージをすべて削除する方法を学びました。