sagantaf

なんでも自分の思ったこと、経験したことを書いて生きます。

Docker実践〜dockerのコンテナ環境をきれいに消す

はじめに

Dockerの検証したり、動作確認したりしていると、Dockerイメージや停止したDockerコンテナがどんどん蓄積されていき、目当てのイメージやコンテナを見つけにくくなることがあります。
そんな時に、一度コンテナのリソースを全て削除してDocker環境をクリーンアップしたくなります。

その方法をまとめました。

クリーンアップするDockerの3つの状態

dockerの状態は3種類あります。
1. Dockerイメージ
 DockerHubから取得したり、自分のDockerfileをビルドして、ローカルに保存したコンテナイメージ
2. 停止中のコンテナ
 Dockerイメージから作成されたけど、起動していない停止状態のコンテナ
3. 稼働中のコンテナ
 docker runコマンドなどで起動しrunning状態のコンテナ

これらを全て消します。


さて、全てを消すには順番を考慮する必要があります。

稼働中のコンテナは削除できないので、一度停止(stop)する必要があります。
つまり、「3. 稼働中のコンテナ」があるとコンテナが消せません。

起動/停止関係なくコンテナが存在すると、そのコンテナで使っているイメージは削除できない制約があります。
つまり、「2. 停止中のコンテナ」があるとイメージが消せません。

ということで、3 → 2 → 1 の順に対応する必要があります。


クリーンアップのためのコマンド

では実際に対応していくためのコマンドです。

1. 稼働中のコンテナの停止

[コマンド]
 docker stop $(docker ps -q)

[解説]
 docker stop コンテナIDもしくはコンテナ名 でコンテナを停止できます。

 また、docker ps でプロセスの状態を確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
330ddbe7aee0        2b8caf31d8fe        "bash"              18 seconds ago      Up 17 seconds                           xenodochial_visvesvaraya


 この時、-qオプションをつけることでコンテナのIDだけを取得できます。

$ docker ps -q
330ddbe7aee0


 つまり、docker ps -q で稼働中のコンテナのIDを取得し、それをdocker stop に渡しているコマンドになります。

 実際にコマンドを実行した結果は以下です。

$ docker stop $(docker ps -q)
330ddbe7aee0

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 

 稼働中のコンテナが無くなったことがわかります。



2. 停止中のコンテナの削除

[コマンド]
  docker rm $(docker ps -aq)

[解説]
 docker rm コンテナIDもしくはコンテナ名 ですべてのコンテナを削除できます。

 また、docker ps -a で停止中/稼働中関係なく全てのコンテナを表示できます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
330ddbe7aee0        2b8caf31d8fe        "bash"                   6 minutes ago       Exited (0) About a minute ago                       xenodochial_visvesvaraya
8aef7f9046fa        ubuntu-dev          "cc --version"           3 weeks ago         Exited (0) 3 weeks ago                              lucid_kowalevski
a542eca70416        ubuntu-dev          "ruby --version"         3 weeks ago         Exited (0) 3 weeks ago                              epic_brown
5225b7609af9        ubuntu-dev          "python --version"       3 weeks ago         Exited (0) 3 weeks ago                              relaxed_brahmagupta
c495fdee1b2b        ubuntu              "node --version"         4 weeks ago         Created                                             focused_aryabhata
0fd1dd889b0a        ubuntu-nodejs-1     "node --version"         4 weeks ago         Exited (0) 4 weeks ago                              practical_snyder
0f68c8d2e932        ubuntu              "/bin/bash"              4 weeks ago         Exited (0) 4 weeks ago                              heuristic_lichterman
c44cde856cf2        ubuntu              "cat /etc/lsb-release"   4 weeks ago         Exited (0) 4 weeks ago                              boring_rosalind


 -q オプションについては先ほどと同じく、コンテナのIDだけを取得できます。

$ docker ps -aq
330ddbe7aee0
8aef7f9046fa
a542eca70416
5225b7609af9
c495fdee1b2b
0fd1dd889b0a
0f68c8d2e932
c44cde856cf2


 つまり、docker ps -q で全コンテナのIDを取得し、それをdocker rm に渡しているコマンドになります。

 実際にコマンドを実行した結果は以下です。

$ docker rm $(docker ps -aq)
330ddbe7aee0
8aef7f9046fa
a542eca70416
5225b7609af9
c495fdee1b2b
0fd1dd889b0a
0f68c8d2e932
c44cde856cf2

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 コンテナがひとつも無くなったことが分かります。


3. イメージの削除

[コマンド]
 $ docker rmi $(docker images -q)

[解説]
 docker rmi イメージID ですべてのイメージを削除できます。

 また、docker images でローカルに保存されている全てのイメージを表示できます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-dev          latest              2b8caf31d8fe        3 weeks ago         625MB
ubuntu-nodejs-1     latest              e581036c1087        4 weeks ago         218MB
ubuntu              latest              735f80812f90        6 weeks ago         83.5MB


 docker psのオプションと同じく、docker images -q としてオプションをつけることで、イメージIDだけを取得できます。

$ docker images -q
2b8caf31d8fe
e581036c1087
735f80812f90


 つまり、docker images -q で全イメージのIDを取得し、それを docker rmi に渡しているコマンドになります。

$ docker rmi $(docker images -q)
Untagged: ubuntu-dev:latest
Deleted: sha256:2b8caf31d8feb3b34708dce7cca268bd60ac9bf877b4bddcba030f27e7a46197
Deleted: sha256:55a35c78d72783d5c6bf1c6fdf4b3918b95cd39938ac06e0f6b5775d9c4775bc
Deleted: sha256:1fc5e8bd33c7b0c5c46db006e7000f130dd9fa5a4fcbe855fe69a4364f746477
Deleted: sha256:5cca3817cd7bdb896379de90c22a76ac89604aaf492d98079f0d78186aec259f
Untagged: ubuntu-nodejs-1:latest
Deleted: sha256:e581036c10872e09c924a830b291fe3d720bb9613dc43b0803d9c6f2eaf2fd80
Deleted: sha256:ec4c6cb855528774f3da2edebc93e3d5a3bd66e392b6c34c549ea75bd701b93f
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Deleted: sha256:735f80812f90aca43213934fd321a75ef20b2e30948dbbdd2c240e8abaab8a28
Deleted: sha256:86267d11f0c14fca869691b9b32bdd610b6ab8d9033d59ee64bdcc2cf0219bce
Deleted: sha256:d9a8b3f912eee0b322b86fa0f6888558a468c384611c71178987b20e3a0ebafc
Deleted: sha256:4e627d1476f22151f05e5214147d6cc6e03ad79a082f01aca6560aa75c7ade3a
Deleted: sha256:757b76a12baba45fcbe76abbdd99723be9d94c12a2ad40354dc49ff5fbe1f5c1
Deleted: sha256:f49017d4d5ce9c0f544c82ed5cbc0672fbcb593be77f954891b22b4d0d4c0a84

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

 イメージが一つも無くなっていることが分かります。


以上で、コンテナ環境をクリーンアップすることができました。



依存関係によるエラーメッセージ例

最後に、対応する順番を考えずに削除などのコマンドを実行した場合のエラーメッセージ例になります。


稼働中のコンテナがある状態で、$ docker rm $(docker ps -aq) でコンテナを削除しようとすると、以下のようなエラーメッセージが出ます。

Error response from daemon: You cannot remove a running container 330ddbe7aee0ce0dc2da9692bfd1c890227a52c01c73d3a8d4b4fccc17b2961b. Stop the container before attempting removal or force remove


コンテナがまだ存在している状態で、$ docker rmi $(dcoker images -q) でイメージを削除用とすると、以下のようなエラーメッセージが出ます。

Error response from daemon: conflict: unable to delete 2b8caf31d8fe (cannot be forced) - image is being used by running container 330ddbe7aee0
Error response from daemon: conflict: unable to delete e581036c1087 (must be forced) - image is being used by stopped container 0fd1dd889b0a


参考文献

Docker

Docker

Docker実践ガイド 第2版 (impress top gear)

Docker実践ガイド 第2版 (impress top gear)

docs.docker.jp