Dockerクリーンアップ手順：不要なイメージとボリュームを削除する方法

# はじめに
現在プログラミングスクール「RUTENQ」で学習中の初学者です🔰
この記事では、Docker環境のローカルPCをクリーンアップする手順を共有します。
記載内容に誤りがあったり、より最適な方法やコマンドがあるかもしれません🙏
その際は教えていただけると幸いです。



# なぜクリーンアップが必要なのか？
Dockerを使用して開発を続けていると、使用していないDockerリソース（イメージ、コンテナ、ボリューム、ネットワーク）がローカルPCにのこったままになります。
これらのリソースは、**ローカルのリポジトリからソースコードを削除しても残ったまま**です。
そのため定期的にクリーンアップを実行して、不必要なオブジェクトを削除し、ストレージを解放することが必要です。

<details>
<summary>Chatgpt-4o解説 クリーンアップとは？</summary>

Dockerを使って開発を続けていると、不要なコンテナ、イメージ、ボリューム、ネットワークなどのリソースがローカルPCに溜まっていきます。これらを削除して、ディスク容量を確保し、環境を整理する作業を「クリーンアップ」と呼びます。
クリーンアップを定期的に行うことで、以下のようなメリットがあります：
・ディスク容量の節約: 不要なデータを削除し、ストレージを有効活用。
・開発環境の安定化: 古いデータや設定が原因で発生するトラブルを防止。
・パフォーマンス向上: 不要なリソースが減ることで、操作や処理のスピードが向上。
クリーンアップは、快適な開発環境を維持するための大切なメンテナンス作業です。
</details>


:::note warn
・クリーンアップを対象を要確認して、誤って必要なリソースを削除しないように注意しましょう。
・特にボリュームはデータベースなどの重要なデータを保持している場合があるため、慎重に確認してください。
:::




# 実行した手順
最初に、以下のドキュメントを参考にしてクリーンアップを実行しました

・[使用していない Docker オブジェクトの削除（prune）](https://docs.docker.jp/config/pruning.html)
・[未使用のDockerオブジェクトを削除する](https://docs.docker.com/engine/manage-resources/pruning/)
　
この手順で、ある程度の不要リソースをクリーンアップすることができました。
しかし、参照が残っているボリュームや特定のイメージなど、`prune` コマンドでは削除対象外となるリソースがあり、完全なクリーンアップには至りませんでした。
そのため、以下の手順で追加のクリーンアップを実施しました。

:::note warn
上記のドキュメントで紹介されている prune コマンドは、未使用リソースのみを安全に削除するよう設計されています。
安全にクリーンアップを行いたい場合は、**上記ドキュメントの手順で十分**だと思います。
これから紹介する手順では、削除対象を慎重に確認してから実行してください。
:::

## コンテナのクリーンアップ

### 1. コンテナを確認
```
docker ps 
```
※ -aオプションをつけることで、停止中のコンテナも全て表示します
```
docker ps -a
```

### 2. 使用していないコンテナを停止
```
docker stop <コンテナID>
```

### 3. 停止しているコンテナを一括削除
```
docker container prune
```
💡参考URL　
[docker container prune](https://docs.docker.com/reference/cli/docker/container/prune/)
### 4. 再度コンテナを確認
```
docker ps 
```
## イメージのクリーンアップ

### 1. イメージの確認
※-aオプションをつけることで、中間イメージも全て表示します
```
docker images -a
```


### 2. イメージを一括削除


```
docker rmi $(docker images -a -q)
```
💡参考URL　[docker rmi](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/rmi/)
### 3. 再度イメージの確認

```
docker images -a
```

## ボリュームとネットワークのクリーンアップ
### 1. ボリュームの確認

```
docker volume ls
```
### 2. ネットワークの確認

```
docker network ls
```

### 3. 不要なボリュームとネットワークを削除

※デフォルトではボリュームが削除されないため、--volumesを付けることで未使用のボリューム削除を削除します。
```
docker system prune --volumes
```
💡参考URL　[docker system prune --volumes]( https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/system_prune/#:~:text=%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82-,%2D%2Dvolumes,-%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E5%89%8A%E9%99%A4)
### 4. 再度ボリュームとネットワークの確認

```
docker volume ls
```
```
docker network ls
```
___
pruneコマンドで未使用と判断されたボリュームのみを削除したため、一部のボリュームが削除対象外でした。
このような場合、以下のコマンドを使用してボリュームを手動で削除することが可能です。状況に応じてお好みの方法を選んで実行してください。
### 1. ボリュームをひとつずつ削除
```
docker volume rm <ボリューム名>
```
### 2.複数のボリュームを一括削除
```
docker volume rm <ボリューム名1> <ボリューム名2> <ボリューム名3>
```
### 3. 必要なボリュームを残して一括削除
※ボリューム1 という名前が含まれるボリュームを除き、すべてのボリュームを削除します。
```
docker volume ls -q | grep -v 'ボリューム1' |xargs docker volume rm
```
💡参考URL　
[grep](https://www.gnu.org/software/grep/manual/grep.html#:~:text=%2Dv-,%2D%2Dinvert%2Dmatch,-%E4%B8%80%E8%87%B4%E3%81%AE%E6%84%8F%E5%91%B3)　[xargs](https://ja.manpages.org/xargs)

# さいごに
Docker環境のクリーンアップ方法について、この記事でご紹介させていただきました。
参考URLも併せてご確認いただければ、より理解が深まると思います。
この記事が少しでも皆さまのお役に立てれば嬉しいです！🌱
最後までお読みいただき、ありがとうございました！