はじめに
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
参考文献
- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Docker実践ガイド 第2版 (impress top gear)
- 作者: 古賀政純
- 出版社/メーカー: インプレス
- 発売日: 2019/02/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る