Dockerのイメージ削除に関する実験

Dockerの参考書(Adrian Mouat著『Docker』)を読みながら、Dockerの勉強を進めてきたのですが、気がつけばダウンロードや新たに作成した(ものと思われる)イメージであふれかえっていました。

不要なイメージは、

$ docker rmi イメージID

で削除できるはずなんですが、ダウンロードしてきたイメージを元に新たなイメージを作成したり、あるいはコンテナが起動したりしていると、イメージが削除できません。

そのあたりのことを理解するために、いろいろと実験してみました。

前提知識

イメージを削除するときは、そのイメージがコンテナで使用されていないことが必要である。
停止されたコンテナで使用されている場合は、まずそのコンテナを削除しなければならない。
(⇒Dockerの停止コンテナを削除する)

コマンドの整理

■コンテナの稼働状況を調べる

$ docker ps (稼働中のコンテナだけを表示する)
$ docker ps -a (すべてのコンテナを表示する)
$ docker ps -q (稼働中のコンテナIDを表示する)
$ docker ps -aq (すべてのコンテナIDを表示する)

■ダウンロードしたイメージを調べる

$ docker images (中間イメージを表示しない)
$ docker images -a (すべてのイメージを表示する)
$ docker images -q (中間イメージ以外のIDを表示する)
$ docker images -aq (すべてのイメージIDを表示する)

これらのコマンドの実行結果をシェル変数として、再度dockerコマンドに渡したりします。
(例)

$ docker rmi $(docker images -qa)

実験開始

■実験1
まず、まっさらの状態で何かイメージをダウンロードします。
ここでは、ubuntu:18.04をダウンロードしました。

$ docker pull ubuntu:18.04

ちゃんとダウロードできたか確認。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               20bb25d32758        10 days ago         87.5MB

今、ダウンロードしたばかりのイメージを削除。

$ docker rmi 20bb25d32758
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:945039273a7b927869a07b375dc3148de16865de44dec8398672977e050a072e
Deleted: sha256:20bb25d32758db4f91b18a9581794cfaa6a8c5fbad80093e9a9e42211e131a48
Deleted: sha256:7b2bffd1a66cacd8cd989f06cee49a1fba28c1d149806a0f7b536229270ddfd2
Deleted: sha256:80f6e37bc2041d00cbd950851c20f0f16b81b8f323290f354279a8a7b62bb985
Deleted: sha256:2069390c92947b82f9333ac82a40e3eeaa6662ae84600a9b425dd296af105469
Deleted: sha256:adcb570ae9ac70d0f46badf9ee0ecd49fbec2ae0bc26254653f99afa60046a4e

ちゃんと削除できたか確認。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

■実験2
イメージをダウンロード後、コンテナを起動。

$ docker pull ubuntu:18.04
$ docker run ubuntu:18.04 echo 'Hello,Docker.'
Hello,Docker.

この状態で、イメージを削除してみる。

$ docker rmi $(docker images -qa)
Error response from daemon: conflict: unable to delete 20bb25d32758 (must be forced)
- image is being used by stopped container ad34b361942c

停止されているコンテナ(ad34b361942c)で使用されているため、削除できないと言われた。
そこで、このコンテナを削除してから、再度イメージを削除してみる。

$ docker rm $(docker ps -aq) ※docker rm ad34b361942cと同じ。
ad34b361942c
$ docker rmi $(docker images -qa)
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:945039273a7b927869a07b375dc3148de16865de44dec8398672977e050a072e
Deleted: sha256:20bb25d32758db4f91b18a9581794cfaa6a8c5fbad80093e9a9e42211e131a48
Deleted: sha256:7b2bffd1a66cacd8cd989f06cee49a1fba28c1d149806a0f7b536229270ddfd2
Deleted: sha256:80f6e37bc2041d00cbd950851c20f0f16b81b8f323290f354279a8a7b62bb985
Deleted: sha256:2069390c92947b82f9333ac82a40e3eeaa6662ae84600a9b425dd296af105469
Deleted: sha256:adcb570ae9ac70d0f46badf9ee0ecd49fbec2ae0bc26254653f99afa60046a4e
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

削除できました。

〜ただいま実験継続中〜