Docker for Macを使っていたら50GB位ディスク容量を圧迫していたのでいろんなものを削除する

# はじめて読む方へ

元の投稿は今より便利ではなかった頃に書いたものです。

今現在手軽に削除したい場合には、以下の2つが便利です。

## コマンドで手軽に消したい場合

`$ docker <Management Command> prune` が便利です。
`<Management Command>` は、container, image, network, volumeなどです。
纏めて削除したい時には `$ docker system prune` を使うとよいでしょう。

```bash
$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all dangling build cache
Are you sure you want to continue? [y/N] y

...

Total reclaimed space: 3.548GB
```

## GUIから手軽に消したい場合

`Reset disk image` を使いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94332/2adaacb6-6741-e4b8-24cd-347b2be94a48.png)

こちらはコマンドと異なり、すべてのコンテナとイメージが削除されます。
細かい設定はできません。


以下、元の記事
----



手元でDockerコンテナを作っては壊し作っては壊しを繰り返してたらディスク容量が10GBを切っていた。


`$ docker rmi`コマンドは常日頃から叩いていたが、全然空き容量が増えないので公式ドキュメントを漁ったりGitHubを漁った記録。


# タグのついていないDocker Imageを削除する

## フィルタを使って一覧を取得する

タグのついていない `<none>` なDockerイメージの一覧は以下のコマンドで取得できる。

```zsh
~ $ docker images --filter "dangling=true"
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
<none>                        <none>              3c3e0fd3f20b        7 hours ago         829.6 MB
<none>                        <none>              bfe7aa3fa29f        7 hours ago         54.23 MB
<none>                        <none>              b13ebf1a4999        2 weeks ago         311.2 MB
<none>                        <none>              2f3c6710d8f2        5 weeks ago         54.23 MB
```

`--filter "dangling=true"` を付けることで、タグのついていないイメージのみ取得できる。

また、`-q` オプションを付けると、IMAGE IDのみ表示される。

```zsh
~ $ docker images --filter "dangling=true" -q
3c3e0fd3f20b
bfe7aa3fa29f
b13ebf1a4999
2f3c6710d8f2
```

オプションは、纏めて `$ docker images -qf dangling=true` とも記述できる。

[docker images - Docker](https://docs.docker.com/engine/reference/commandline/images/#/filtering)

## フィルタを使ったDocker Imageの削除

タグのついていないイメージのみ削除する場合には、

`$ docker rmi $(docker images -f "dangling=true" -q)
` または
`$ docker images -qf dangling=true | xargs docker rmi`
[docker rmi - Docker](https://docs.docker.com/engine/reference/commandline/rmi/)

上記の公式ドキュメントでは前者のコマンドが書いてある。個人的には xargs を使った後者を使っている。

タグの有無に関わらず、イメージをすべて消したい場合には、
`$ docker images -q | xargs docker rmi -f`




# 起動していないDocker Containerを削除する

## フィルタを使って一覧を取得する

```zsh
~ $ docker ps -af status=exited
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e7340bde4353        03f4cae76966        "/bin/bash"              7 hours ago         Created                                 gloomy_bhabha
f6a581344af6        9e8c4e00c6a3        "./bin/catalina.sh ru"   11 hours ago        Created                                 elated_shannon
```

`ps` コマンドはデフォルトで動作中(running)なコンテナしか表示されない。
その為、動作中以外のコンテナも表示するには `-a` を付ける必要がある。

その上で起動していないコンテナのみ表示するには、 `-af status=exited` を指定する。

こちらも `-q` オプションを使うと CONTAINER ID のみ出力できる。

[docker ps - Docker]
(https://docs.docker.com/engine/reference/commandline/ps/#/filtering)

## フィルタを使ったDocker Containerの削除


[docker rm - Docker](https://docs.docker.com/engine/reference/commandline/rm/#/filtering) には `$ docker rm $(docker ps -a -q)` と書いてあるが、これではコンテナ全部消すには消すけれども、コンテナに紐づくData Volumeを消さないのでなんだかなーと思った。

`$ docker rm -v $(docker ps -aqf status=exited)`
または
`$ docker ps -aqf status=exited | xargs docker rm -v`

と `-v `を付けると、紐づくData Volumeも一緒に削除できるのでこちらを使っている。(ただし、明示的に名前を付けたData Volumeは削除されない)

# どのコンテナにも紐付いていないData Volumeを削除する

うっかり増えてたヤツ。

## フィルタを使って一覧を取得する

`$ docker volume ls` も `-f dangling=true` で紐付いていないものに限定して取得できる。

```zsh
~ $ docker volume ls -f dangling=true
DRIVER              VOLUME NAME
local               3737418ba886be4252424e1012a6840e418175f14ef7763c08cc629c97c4ae3d
local               9b028e7810266710032c82b2f0aca040100ffc2876e5ad73944838ae8eaf7051
local               c2a61b02d71e67668905354d1e365d0f59966114b66ea2620bc28ab3bdf73b01
local               cbbad0a5be79e712e784cada333ead7df748157e8c004c060ea0fc38d8aa586a
...
```
[docker volume ls - Docker](https://docs.docker.com/engine/reference/commandline/volume_ls/)

開発環境でDockerコンテナをガンガン作ってたら凄い数になってた。

## フィルタを使ったData Volumeの削除

イメージやコンテナを削除するのと大体同じ形で、
`$ docker volume ls -qf dangling=true | xargs docker volume rm`
[docker volume rm - Docker](https://docs.docker.com/engine/reference/commandline/volume_rm/)

# Docker Composeで利用しているコンテナを削除する

## 一覧を取得する

Docker Composeに関してはフィルタはない。

```zsh
~ $ docker-compose ps
       Name                      Command               State                    Ports
-------------------------------------------------------------------------------------------------------
testcompose_db_1      docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp
testcompose_nginx_1   nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
testcompose_rails_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp
```

## Docker Composeコンテナの削除

docker-compose.ymlがあるディレクトリでDocker Composeで使っているコンテナを削除するには
`$ docker-compose rm -v`
を使う。
[docker-compose rm - Docker](https://docs.docker.com/compose/reference/rm/)

`-v` オプションでData Volumeも削除する。確認が不要なら `-f`オプションを付ける。


`$ docker-compose rm` は `$ docker-compose build`して作ったDockerコンテナが削除されるだけなので、上の方で書いたDockerコンテナ削除コマンドを叩いておけば普段は問題ない。

# 削除コマンドをaliasとして登録しておく

怠惰は美徳。
自分の.zshrcに書いておくと、忘れても参照できるというのもポイントが高い。

```zsh:.zshrc
alias d='docker'
alias dc='docker-compose' # sorry ex-dc...
alias dc_build_up='docker-compose rm -fv && docker-compose build && docker-compose up'
alias rm_docker_images='docker images -qf dangling=true | xargs docker rmi'
alias rm_docker_containers='docker ps -aqf status=exited | xargs docker rm -v' # rm with volumes
alias rm_docker_volumes='docker volume ls -qf dangling=true | xargs docker volume rm'
alias rm_docker_compose_containers='docker-compose rm -fv'
```

ここでの追加説明として、 `$ dc_bulid_up` で `docker-compose rm -fv && docker-compose build && docker-compose up`を実行できるようにしている。
こうすることでDocker Composeでコンテナを作り直す際に既存のコンテナ・ボリュームを削除して綺麗に作ることができる。通常の `build` や `up` コマンドと共に使い分けると良い。

余談だが `d`, `dc`をdocker, docker-composeのaliasにしている。
元の `dc` コマンドには正直申し訳ないが `docker-compose` コマンドを叩くことの方が多い...
[dcを使ってみる。 - ここにタイトルを入力|](http://d.hatena.ne.jp/goth_wrist_cut/20080218/1203327063)


# それでもディスク容量が戻らない

もしすべてのイメージやコンテナを削除してもいいなら、Dockerを止めた後に ~/Library/Containers/com.docker.docker/Data/* をまるごと消す。
[Docker.qcow2 never shrinks - disk space usage leak in docker for mac · Issue #371 · docker/for-mac](https://github.com/docker/for-mac/issues/371#issuecomment-248404423)

自分の環境では Docker.qcow2 ファイルが50GBほどあったのでほぼこのファイルが原因だった。

この記事を書いている5日前にissueに ~/Library/Containers/com.docker.docker/Data/database/ を直接編集してqcow2ファイルのファイルサイズ上限を下げる方法が投稿されている。
https://github.com/docker/for-mac/issues/371#issuecomment-262826610 

上記issueの盛り上がりを見る限り、その内UI提供されそうな雰囲気があるがもし今現在問題に苦慮している人はqcow2のファイルサイズ上限を変更すると良さ気。

これらを行って、何とか元々の空き容量70GB程まで戻すことができた。

![Screen Shot 2016-11-30 at 02.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/94332/2d9cd2ef-f78d-b4ff-17c9-794751be914b.png)

# 追記1 2016-11-30 10:42

@otolab さんからDocker for Macでは reset to factory defaults でも ~/Library/Containers/com.docker.docker/Data/* を削除できるとアドバイスいただきました。

![Screen Shot 2016-11-30 at 10.22.42.png](https://qiita-image-store.s3.amazonaws.com/0/94332/34f7d853-f931-4889-8482-84ae0152420c.png)

ここから Reset to factory default を実行する。

使用メモリ量などの設定も削除されてしまいますが全部消せます。ただ今はあまり使わなくても大丈夫そうです。

# 追記2 2017-01-26 19:46

docker 1.13.0 から、 `$ docker system prune` コマンドが追加されました。
実行することで、

* 停止中のコンテナすべて
* 紐付いていないデータボリュームすべて
* 紐付いていないネットワークすべて
* 紐付いていないイメージすべて

が削除可能です。

# 追記3 2017-06-30 10:51(修正: 2017-08-18 17:39)

Version 17.06.0-ce-mac18 (18433) にて、GUI上から使用メモリ量などの設定は残したままコンテナやデータボリュームを削除できるボタンが追加されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94332/bc988d8f-5dfa-2cd9-7368-2748f39dccc7.png)

# 追記4 2018-01-24 14:24

Docker Community Edition 17.12.0-ce-mac46 2018-01-09 (Stable) にて、GUI上から仮想ディスクイメージのサイズを変更できる機能が追加されてました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94332/024bd55d-a4cc-3356-68a8-642053223993.png)