はじめて読む方へ
元の投稿は今より便利ではなかった頃に書いたものです。
今現在手軽に削除したい場合には、以下の2つが便利です。
コマンドで手軽に消したい場合
$ docker <Management Command> prune
が便利です。
<Management Command>
は、container, image, network, volumeなどです。
纏めて削除したい時には $ docker system prune
を使うとよいでしょう。
$ 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
を使いましょう。
こちらはコマンドと異なり、すべてのコンテナとイメージが削除されます。
細かい設定はできません。
以下、元の記事
手元で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 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]
(https://docs.docker.com/engine/reference/commandline/ps/#/filtering)
フィルタを使った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コンテナをガンガン作ってたら凄い数になってた。
フィルタを使った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に書いておくと、忘れても参照できるというのもポイントが高い。
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を使ってみる。 - ここにタイトルを入力|
それでもディスク容量が戻らない
もしすべてのイメージやコンテナを削除してもいいなら、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程まで戻すことができた。
追記1 2016-11-30 10:42
@otolab さんからDocker for Macでは reset to factory defaults でも ~/Library/Containers/com.docker.docker/Data/* を削除できるとアドバイスいただきました。
ここから 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上から使用メモリ量などの設定は残したままコンテナやデータボリュームを削除できるボタンが追加されました。
追記4 2018-01-24 14:24
Docker Community Edition 17.12.0-ce-mac46 2018-01-09 (Stable) にて、GUI上から仮想ディスクイメージのサイズを変更できる機能が追加されてました。