Mac
OSX
docker
docker-compose
docker-for-mac

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

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

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

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

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

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

~ $ 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のみ表示される。

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

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

docker images - Docker

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

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

$ docker rmi $(docker images -f "dangling=true" -q)
または
$ docker images -qf dangling=true | xargs docker rmi
docker rmi - Docker

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

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

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

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

~ $ 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

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

docker rm - Docker には $ 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 で紐付いていないものに限定して取得できる。

~ $ docker volume ls -f dangling=true
DRIVER              VOLUME NAME
local               3737418ba886be4252424e1012a6840e418175f14ef7763c08cc629c97c4ae3d
local               9b028e7810266710032c82b2f0aca040100ffc2876e5ad73944838ae8eaf7051
local               c2a61b02d71e67668905354d1e365d0f59966114b66ea2620bc28ab3bdf73b01
local               cbbad0a5be79e712e784cada333ead7df748157e8c004c060ea0fc38d8aa586a
...

docker volume ls - Docker

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

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

イメージやコンテナを削除するのと大体同じ形で、
$ docker volume ls -qf dangling=true | xargs docker volume rm
docker volume rm - Docker

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

一覧を取得する

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

~ $ 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

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

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

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

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

.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_updocker-compose rm -fv && docker-compose build && docker-compose upを実行できるようにしている。
こうすることでDocker Composeでコンテナを作り直す際に既存のコンテナ・ボリュームを削除して綺麗に作ることができる。通常の buildup コマンドと共に使い分けると良い。

余談だが d, dcをdocker, docker-composeのaliasにしている。
元の dc コマンドには正直申し訳ないが docker-compose コマンドを叩くことの方が多い...
dcを使ってみる。 - ここにタイトルを入力|

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

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

自分の環境では 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

追記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

ここから 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

追記4 2018-01-24 14:24

Docker Community Edition 17.12.0-ce-mac46 2018-01-09 (Stable) にて、GUI上から仮想ディスクイメージのサイズを変更できる機能が追加されてました。
image.png