sagantaf

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

Dockerのコンテナ環境をきれいに消す


Dockerの検証したり、動作確認したりしていると、Dockerイメージや停止したDockerコンテナがどんどん蓄積されていって、目当てのイメージやコンテナを見つけにくくなる。

そのため、一度Dockerのコンテナ環境をクリーンアップする方法をまとめてみた。

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

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

これらを全て消す。


稼働中のコンテナは削除できないので、一度停止(stop)する必要がある。
 →3:稼働中のコンテナ があるとコンテナが消せない

コンテナが存在すると、そのコンテナで使っているイメージは削除できない制約がある。
 →2:停止中のコンテナ があるとイメージが消せない

つまり、Dockerの依存関係として 3 → 2 → 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 

 ↑稼働中のコンテナが無くなったことが分かる。



②停止中のコンテナの削除

 $ 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

↑コンテナがひとつも無くなったことが分かる。


③イメージの削除

 $ 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 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

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



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



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


稼働中のコンテナは削除できないので、一度停止(stop)する必要がある。
 →3:稼働中のコンテナ があるとコンテナが消せない


→稼働中のコンテナがある状態で、$ 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



コンテナが存在すると、そのコンテナで使っているイメージは削除できない制約がある。
 →2:停止中のコンテナ があるとイメージが消せない


→コンテナが存在している状態で、$ 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