そろそろ年末なので年明けて気持ちよくDockerを使い倒すために大掃除する話し

この記事は「[ゆるっと Advent Calendar 2020](https://qiita.com/advent-calendar/2020/yurutto)」 25日目の記事です

# 初めに

2020年もあと少しで終わりです。年末、年明けを気持ちよく過ごしたいです。
普段のお仕事で使用頻度が(多分)一番高いDockerの掃除をして年明け気持ちいDockerライフを送ることを目指します。

※ 下記のDokcerリソースを動作している、停止している関係なく全て削除します。

- コンテナ
- イメージ
- ネットワーク
- ボリューム
- キャッシュ

# コンテナを全て削除する
まずはすべてのコンテナを下記手順で削除します。

1. コンテナ一覧を確認
2. 全てのコンテナをストップ
3. 全てのコンテナを削除

## 1. コンテナ一覧を確認
コンテナの一覧を見たいときは`docker ps -a`で見ることができます

```bash

$ docker ps -a
CONTAINER ID        IMAGE                                                                       COMMAND                  CREATED             STATUS                     PORTS                    NAMES
8e628c6d89be        lab-test                                                                    "bash"                   10 days ago         Exited (0) 10 days ago                              beautiful_hermann
79832a249067        lab-test                                                                    "bash"                   10 days ago         Exited (1) 10 days ago                              intelligent_kirch
db62543bae14        7f4591b869f3                                                                "bash"                   11 days ago         Exited (0) 11 days ago                              wonderful_nash
dc7eab95300d        7f4591b869f3                                                                "bash"                   11 days ago         Exited (0) 11 days ago                              kind_proskuriakova
68691ef5b776        681b31775932                                                                "bash"                   11 days ago         Exited (1) 11 days ago                              adoring_snyder
386bbaa3699a        681b31775932                                                                "bash"                   11 days ago         Exited (129) 11 days ago                            vigorous_margulis
.
.
.
``` 

ちなみに

`docekr ps -aq`をするとコンテナのIDだけを出力してくれます

```bash
$ docekr ps -aq
f26dd4661c42
8e628c6d89be
79832a249067
79d9e52e5e76
.
.
.
```

## 2. 全てのコンテナをストップ

全てのコンテナを見ることができたので次にすべてのコンテナを一度停止させます
コマンドは`docker stop $(docker ps -aq)`

```bash
$ docker stop $(docker ps -aq)
```

その次に下記コマンドを入力して起動してるコンテナがないか念のため確認します

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

## 3. 全てのコンテナを削除
全てのコンテナを停止させることができたので次は全てのコンテナを下記コマンドで削除します。

```bash
$ docker rm $(docker ps -aq)
```

削除できたかどうか確認します。
これで起動している起動していないにかかわらずすべてのコンテナを終了させることができました。

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

# イメージを全て削除する
先ほどコンテナを全て削除することができたので次はイメージを下記手順で削除します。

1. イメージ一覧の確認
2. イメージの全削除

## 1. イメージ一覧の確認
まずはイメージがどれくらいあるか確認します。
ちなみに最近`docker images`の`-a`オプションの意味を最近知りました。

中間イメージを表示してくれるみたいです。`docker images -h`の内容を読んで初めて知りました。

```bash
$ docker images -aq
056a32e64258
bfdf7441bdfc
24136c61804b
.
.
.
```

## 2. イメージの全削除

イメージの一覧を確認できたので下記コマンドで全て削除します。
`-f`オプションを付けることでイメージの削除を強制することができます。

```bash
$ docker rmi -f $(docker images -aq)
```

削除が終わったら念のためイメージ一覧を確認します。

```bash
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```
これでイメージの削除が終わりました。

# ネットワークを削除する
dockerが作成したネットワークを下記の手順で削除していきます。

1. ネットワーク一覧の確認
2. ネットワークの削除

## 1. ネットワーク一覧の確認
ネットワークの一覧は下記コマンドで確認できます。
ちなみにbridge,host,noneはデフォルトで存在しているネットワークになります。

```bash
$ docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
20e1d4898d67        bridge              bridge              local
2a419890b777        host                host                local
a275a9c25a0c        influxdb_default    bridge              local
6521ba142a08        labs_default        bridge              local
ab08971ace6d        mongo_default       bridge              local
4087108a7f37        none                null                local
```

## 2. ネットワークの削除
先ほどまでは削除コマンドにIDの一覧を渡して削除していましたが、network,volumeに関してはpruneオプションを利用します。
`rm`オプションもあるんですが下記2点がわからないので試したことないですね。今度試してみようかしら？

- IDを渡すことができるのか
- デフォルトのネットワークがどうなるかがわからない

```bash
$ docker network prune -f
Deleted Networks:
mongo_default
labs_default
influxdb_default
```

これでデフォルトで作成されるネットワーク以外のネットワークを削除しました。
念のため確認します。デフォルト以外が消えているので大丈夫そうです。

```
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
20e1d4898d67        bridge              bridge              local
2a419890b777        host                host                local
4087108a7f37        none                null                local
```

# ボリュームの削除
dockerが作成したボリュームをネットワークと同じような手順で削除します。

1. ボリューム一覧の確認
2. ボリュームの削除

## 1. ボリューム一覧の確認
ボリュームの一覧は下記コマンドで確認できます。

```bash
$ docker volume ls
DRIVER              VOLUME NAME
local               1a2ff7bbf277fb6f134ef03f63604cf9d79a7bb3c13dd76ee5ee43370979266a
local               4b4ffeb6c0ea586148eb1e140c4a2bb9c8b062ccccd3c1916c0c8b1fe7362c9f
local               4d53cbc45378083f9ebbf798a90442b6d1cf0778ea28a24328dcfda0682dadb4
local               6cd26eb1a2f0f175b13d3cfdb0106b8dc88fdf8a7ce08ca5c6209f22e21e3f28
.
.
.
```

## 2. ボリュームの削除
下記コマンドでボリュームを削除します
> Total reclaimed space: 2.991GB

ちなみに私の環境では2.991GB程度空きができました。
頻繁にやってるつもりですがすぐ溜まっちゃいます

```
docker volume prune -f
Deleted Volumes:
local               1a2ff7bbf277fb6f134ef03f63604cf9d79a7bb3c13dd76ee5ee43370979266a
local               4b4ffeb6c0ea586148eb1e140c4a2bb9c8b062ccccd3c1916c0c8b1fe7362c9f
local               4d53cbc45378083f9ebbf798a90442b6d1cf0778ea28a24328dcfda0682dadb4
local               6cd26eb1a2f0f175b13d3cfdb0106b8dc88fdf8a7ce08ca5c6209f22e21e3f28
.
.
.
Total reclaimed space: 2.991GB
```

念のために確認します。

```
$ docker volume ls
DRIVER              VOLUME NAM
```

これでボリュームを全て削除することができました。


## キャッシュを削除
`docker build`した際に作られるキャッシュを削除します。
(実はこのキャッシュについてほとんど知識がないです)
私の環境ではキャッシュがなかったようなので0Bになっています

```bash
$ docker builder prune -f
Total reclaimed space: 0B
```

# 削除されているか確認
最後に掃除されているか確認します(最初にこのコマンド入力すればよかったけど後の祭りです)

```bash
$ docker system df 
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              0                   0                   0B                  0B
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
20e1d4898d67        bridge              bridge              local
2a419890b777        host                host                local
4087108a7f37        none                null                local
```

# 最後に感想とか

今回は、Dockerの大掃除を行いました。これで年明け気持ちよく使い始めることができると思います。
Dokerコマンドのヘルプはかなりわかりやすいと考えています。何か困ったら`-h`をとりあえずやって見るのがいいかもしれません。

Dockerのデフォルトで作成されるネットワークは削除していいのかまた別の機会に調べます。

# 参考
- https://docs.docker.com