Help us understand the problem. What is going on with this article?

Dockerの不要コンテナを一括削除する

最近AWSのEC2(AmazonLinux2)上でDockerを入れて色々と遊んで勉強しているのですが、
centosのコンテナを作成する → ごにょごにょする → 終わる、mysqlのコンテナを作る → ごにょごにょする → 終わるなどを繰り返し行い、たまにdocker psコマンドでコンテナの稼働状況を確認してたんですが、ある時docker ps -aを実行したところなんじゃこりゃぁ!!となりました。
そこで「Dockerコンテナは終わっても、Dockerの事は嫌いにならないでください!」と
◯田敦子さんが言ったかどうかは定かではないですが、少なくともDockerコンテナは終わってもDockerコンテナは残っているという事を学んだわけです。

無駄な前置きが長くなりましたが、この溜まりに溜まったゴミDockerコンテナを削除するための
コマンドの覚書です。

awkを利用した不要コンテナの削除

削除前の状態

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                    NAMES
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days                 3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days                 0.0.0.0:9989->8080/tcp   centos_container
149e47fc7182        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              silly_haibt
6d0b42666db1        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              stoic_panini
cc75432e283b        mysql               "docker-entrypoint.s…"   4 days ago          Exited (127) 4 days ago                            serene_merkle
e75ea014088a        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              laughing_allen
7f6d0144717d        centos              "/bin/bash"              4 days ago          Exited (0) 4 days ago                              zealous_haibt
b78d2f0c9b93        centos              "/bin/bash"              4 days ago          Exited (0) 4 days ago                              centos_1
a1adb31a4719        mysql               "docker-entrypoint.s…"   4 days ago          Exited (0) 4 days ago                              mysql_container
b977c75c9dd7        mysql               "docker-entrypoint.s…"   4 days ago          Exited (1) 4 days ago                              bold_nobel
6c590752cab8        mysql               "docker-entrypoint.s…"   4 days ago          Exited (1) 4 days ago                              gifted_nightingale

上記のうち、稼働中の上2つ以外を削除する。
※今回はdocker ps -f status=<ステータス>で"Exited"のコンテナのみを削除

docker ps -f status=exited | awk '{print $1}' | xargs docker rm

実行結果

149e47fc7182
6d0b42666db1
cc75432e283b
e75ea014088a
7f6d0144717d
b78d2f0c9b93
a1adb31a4719
b977c75c9dd7
6c590752cab8
Error: No such container: CONTAINER
[ ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days           3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days           0.0.0.0:9989->8080/tcp   centos_container

無事不要なコンテナは消えましたが、ヘッダー行の"CONTAINER"でdocker rmをしようとしてエラーとなってますね。。(ま、いっか)

Docker公式ドキュメント方式(-_-) ※こちらおすすめしております!

上記コマンド作成後、Docker公式マニュアルに稼働していないコンテナ削除方法が載ってました。。
上のしょーもないawk方式なんかより先に載せろよと言われるかもしれませんが...

実行前状態(もう一度不要なコンテナを増産しました)

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
109839ada027        centos              "/bin/bash"              35 seconds ago      Exited (0) 34 seconds ago                            vibrant_bohr
cf2e8c41b2ee        centos              "/bin/bash"              36 seconds ago      Exited (0) 36 seconds ago                            brave_mestorf
fcfdaf35235d        centos              "/bin/bash"              37 seconds ago      Exited (0) 37 seconds ago                            gallant_faraday
bf7b9fa96291        centos              "/bin/bash"              38 seconds ago      Exited (0) 38 seconds ago                            zealous_morse
9ec50bb2ac79        mysql               "docker-entrypoint.s…"   4 days ago          Up 2 days                   3306/tcp, 33060/tcp      MYSQL
20cabc9db638        centos              "/bin/bash"              4 days ago          Up 2 days                   0.0.0.0:9989->8080/tcp   centos_container

削除コマンド

コマンド説明(公式マニュアルより)

このコマンドは停止しているコンテナを全て削除します。コマンド docker ps -a -q は終了した全てのコンテナ ID を rm コマンドに渡し、全て削除するものです。実行中のコンテナは削除されません。

docker rm $(docker ps -a -q)

実行結果

109839ada027
cf2e8c41b2ee
fcfdaf35235d
bf7b9fa96291
Error response from daemon: You cannot remove a running container 9ec50bb2ac797f3cfdbe827aa2793ba135f6f29e9fd2c1b179afa09d6be4b5ba. Stop the container before attempting removal or force remove
Error response from daemon: You cannot remove a running container 20cabc9db6380304c3c0c3b8a14f04e0bd60fd58c810ee4c02d6539fd5b4f3f3. Stop the container before attempting removal or force remove

実行中のコンテナは削除しようとしてエラーとなります。
試してはいませんが、docker rm -f $(docker ps -a -q)とするとコンテナ皆殺しの刑に処す!
となるはずですし、ここまで読んだ殆どの方はお気づきかと思いますが、上記awk方式で実施した
内容も下記コマンドで実現できます...

docker rm $(docker ps -f status=exited -q)

それでは、お後がよろしいようで。。。テケテン

yasutti-ja
SIer業界に属し、客先常駐でSEをしています。 現場ではなかなか実践の機会のない技術を自学習で触れるようにしています。 自分の技術力を上げるべく、新しい言語等にも挑戦し日々研鑽を積んで行く所存です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした