最近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)
それでは、お後がよろしいようで。。。テケテン