ローカル環境の docker を断捨離するためにやること

# まえがき

本記事は [Docker Advent Calendar 2018](https://qiita.com/advent-calendar/2018/docker) の 19日目の記事です。  

こんにちは
そろそろ Docker 初心者は卒業しないといけないエンジニアです。

この記事では Docker の勉強のためにローカル環境でいろいろ実験した結果
**「このイメージは何？」「なんでコンテナが起動してるの？」**とよく分からなくなってしまった私の経験をもとに、ローカル環境を断捨離するためにやることを自分なりにまとめてみました。

この記事が Docker 初学者のみなさんの助けになれば幸いです。  

# ローカル環境の前提  

* OS: Mac
  * 他の OS でも構いませんが、説明の都合上 Mac ユーザーを前提にお話します
* シェル: bash
  * fish や zsh でも構いませんが、コマンドが一部異なる場合があります  
* Docker for mac をインストール済み  
  * Docker for mac をインストールするためには Mac の[ハードウェア要件とソフトウェア要件](https://docs.docker.com/docker-for-mac/install/#what-to-know-before-you-install)を満たしている必要があります。  

# Docker for mac でローカル環境に増えていくデータ

Docker for mac をローカル環境で使っていると
大まかにいうと、下記のようなデータが増えていくと思います。

* コンテナ
* イメージ 
* ボリューム  
* 仮想環境の領域

データが増えていくというのはローカル環境のストレージを圧迫していくことをイメージしてください。
必要なものがローカル環境にあるのはもちろん構わないのですが、もう使わなくなったものは積極的にキレイにしていきたいですよね。

## コンテナ

### まずは現状の確認

ローカル環境に存在する全てのコンテナを表示します。

```
docker ps -a
```

"全て" というのは起動していないコンテナも全て含みます。
docker でしばらく遊んでいると意外に認識していない停止中のコンテナが残っているものです。 

### 不要なコンテナは削除・削除

* コンテナを指定して削除

```
docker rm [CONTAINER ID]
```

CONTAINER ID は `docker ps` で確認できます。
削除するコンテナが起動中の場合は `docker stop [CONTAINER ID]` でコンテナを停止しましょう。
`docker rm -f [CONTAINER ID]` で強制的に削除するという攻め方も個人的には好きです。

* 停止中のコンテナはいらない！

```
docker container prune
```

* とにかくコンテナは全部いらない！

```
docker ps -aq | xargs docker rm -f
```

## イメージ

### まずは現状の確認

ローカル環境に作られている全ての Docker イメージを表示します。

```
docker images -a
```

"全て" というのはイメージを作るにあたって必要になる中間イメージも含めて全てです。
中間イメージはイメージをビルドする際にキャッシュとして再利用されます。
ということは、**中間イメージが多いほど後述する仮想環境の領域に多くのデータが保存されるということになります。**

### 不要なイメージは削除・削除

* イメージを指定して削除

```
docker rmi [IMAGE ID]
```
IMAGE ID は `docker images` で確認できます。

* 使っていないイメージはいらない！

```
docker image prune
```

* とにかくイメージは全部いらない！

```
docker images -aq | xargs docker rmi -f
```

これらのコマンドは<font color="orange">削除するイメージが起動中のコンテナから参照されてない</font>必要があります。
ここでイメージを削除できなかった場合は先にコンテナの整理を行いましょう。

## ボリューム

### まずは現状の確認

ローカル環境に存在する全てのボリュームを表示します。

```
docker volume ls
```

"全て"というのはいずれのコンテナからも参照されていないボリュームも含みます。

### 不要なボリュームは削除・削除  

* ボリュームを指定して削除  

```
docker volume rm [VOLUME NAME]
``` 

VOLUME NAME は `docker volume ls` で確認できます。

* 未使用のボリュームはいらない！

```
docker volume prune
```

これらのコマンドは<font color="orange">削除するボリュームが起動中のコンテナから参照されてない</font>必要があります。
ここでボリュームを削除できなかった場合は先にコンテナの整理を行いましょう。

## 仮想環境の領域  

Docker は Linux カーネルが持つコンテナ技術を用いた仮想化技術なので
**Linux のカーネル上でしか動作しません。**

したがって、Docker for mac では _HyperKit_、 Docker for windows では _Hyper-V_ という 仮想環境に Linux を立ち上げて、その上で間接的に Docker を動かしているというわけです。

ローカル環境で Docker のイメージやコンテナやボリュームを増やしていくと
この VM 環境の領域も自動的に拡張されていきます。
ですが、これらのイメージやコンテナやボリュームを削除しても、拡張された 仮想環境の領域はそのままなのでローカル環境のストレージを圧迫し続けるといった事態が起こります。

### まずは現状の確認

```
ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw 
-rw-r--r--  1 root root 30G 12 16 17:26 /Users/tasmania/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
```

現在は仮想環境の disk image size は 30G です。
こちらの設定は Docker for mac の `Preferences > Disk` で確認できます。  
<img width="600" alt="docker disk setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/89967/27fd577e-11ae-8706-de12-6c8d34d60572.png">

* `Docker.raw` が仮想環境のファイルなのですが、 Docker for mac のバージョンによっては `Docker.qcow2` と呼んでいたりします。
* `$HOME/library/containers/com.docker.docker/data/com.docker.driver.amd64-linux/Docker.qcow2` に仮想環境ファイルがある場合もあります。

これは、qcow2 形式より raw 形式の方が disk パフォーマンス良いという文脈で
Docker for mac のアップデートとともに、デフォルトのファイル形式が変更されているという経緯があります。

なので、 Docker for mac の `Preferences > Disk` で現在の設定を確認するのが一番確実です。

### 仮想環境のリサイズ

先ほどの仮想環境の disk の設定では `Disk image size: 32.0GB(3.0 GB on disk)` とあるように、**実際は 3.0 GB しか使っていないけど Docker 用に 32.0GB 分の仮想環境を確保している**ことになっています。

先程も書いた様に、拡張した仮想環境は自動的には収縮しません。
なので、余分にディスクを圧迫しない様にディスクイメージのサイズを適度なものに調整しましょう。

<img width="600" alt="docker disk setting change.png" src="https://qiita-image-store.s3.amazonaws.com/0/89967/6d1d6fa0-4a04-ffc1-261a-6165ba0d9836.png">

Disk image size のメモリを 16.0 GB に変更して Apply をクリック！

## <font color="red">全部一旦キレイにしたいというあなた</font>

ここまで、コンテナ・イメージ・ボリュームと個別に断捨離をしていきましたが

**「ええい！煩わしい！全部リセットだ！」**

というあなた。気が合います。

Docker for mac の `Preferences > Reset` の `Rest disk image` を選べば
起動中・使用中問わず全てのコンテナやイメージを全てディスクからリセットできます。

<img width="600" alt="docker disk reset.png" src="https://qiita-image-store.s3.amazonaws.com/0/89967/3b0eed88-239f-afcd-97fe-ae12186dbe5a.png">

現在のローカル環境にある Docker の諸々に心残りのない方はこれを行うのが一番早いと思います。

# おわりに

Docker を使って何かすごいものを作ったりするというよりは
Docker 活動によって生まれた成果物を整理し、ディスクをキレイにするための基本的な操作を紹介する記事にしました。

断捨離大事だと思います。