Dockerお掃除大作戦

2018年5月29日

こんにちは。
gendosuです。

今回は前回のDocker関連ネタから少し時間もたち、Dockerも進化を続けているので
ここ最近のDocker事情、MacbookのSSD圧迫問題を再度取り上げてみます。

相変わらずDockerをしばらく使っていると不要なイメージやコンテナがたまってしまいますね。

今回はこれらを「なるべく安全」にお掃除する手順を考えたいと思います。

まずは、何を掃除したら良いのか、と言う情報の出し方

docker system df コマンド

$ docker help system df

Usage: docker system df [OPTIONS]

Show docker disk usage

Options:
--format string Pretty-print images using a Go template
-v, --verbose Show detailed information on space usage

このコマンドはそのままズバリ
docker関連ファイルがどの程度ディスクを消費しているかを表示してくれます。

$ docker system df
TYPE          TOTAL ACTIVE SIZE    RECLAIMABLE
Images        28    18     13.94GB    8.228GB (59%)
Containers    32    0      310.6MB    310.6MB (100%)
Local Volumes 18    15     6.053GB    55.67MB (0%)
Build Cache                0B         0B

このような感じですね。

この出力を見ると、RECLAIMABLEというところがクリア可能な容量となっています。

Imagesが特に多く消費されているのが分かると思います。

ちなみに、docker systemのコマンドは

$ docker help system

Usage: docker system COMMAND

Manage Docker

Commands:
df         Show docker disk usage
events     Get real time events from the server
info       Display system-wide information
prune      Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

dfのほかにもevents、info、pruneというのがあります。
若干危険なのはpruneコマンドです。
これは、–allオプションを付けて実行するとクリア可能(dfの結果のRECLAIMABLE)な部分がすべて解放される強力なコマンドです。
これを実行するのが一番効率が良いのですが開発でDockerを使う場合、すべてがイメージにコミットされているわけでも無くすべてがvolumeに保存されているわけでも無く大抵の更新可能な情報はコンテナ上に置いてある物と思います。
この状態で、何も考えずにpruneすると、コンテナが全部消えます。
理想はすべて永続化しましょう。
なのですが、そうなってない環境も多いと思います。

ですので、コンテナを消さず、不要なイメージなどを消していく、という形で対応したいと思います。

docker run -it ruby:latest bash

とかでrubyの動作を確認したり、–rmオプションをうっかり付け忘れた場合
コンテナはランダムなコンテナ名を割り当てられ、exitした状態で残ってしまいます。このうっかりゴミコンテナを消すには

docker ps -a
このコマンドでコンテナ一覧を表示します。

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                CREATED        STATUS                    PORTS NAMES
f79dce728424   testimage      "./entrypoint.sh for…" 3 days ago     Exited (0) 13 hours ago         testimage_main_1
76872818483a   postgres:9.6.8 "docker-entrypoint.s…" 5 days ago     Exited (0) 9 hours ago          testimage_postgres_1
568ea94a14ce   ruby:latest    "bash"                 7 seconds ago  Exited (0) 4 seconds ago        quizzical_keller

NAMESのところで、見たことがない名前のコンテナがあったら
それはほぼゴミコンテナです。
消しましょう。

docker rm [コンテナ名] [コンテナ名]
という感じに。

コンテナが消せたら、下準備OKです。

docker images を実行してみましょう。

$ docker images
REPOSITORY                        TAG          IMAGE ID       CREATED      SIZE
gendosu/ruby-for-rails-51 2.3.7   latest       d965e266133e   3 days ago   1.51GB
gendosu/ruby-for-rails 2.3.7      latest       ff582c44e421   3 days ago   1.13GB
ruby                              latest       677dc4db9b8f   3 days ago   869MB
<none>                            <none>       9b8b253b1050   7 weeks ago  245MB
postgres                          9.6.8        ee7bf928a9ff   2 months ago 266MB
postgres                          latest       30121e967865   2 months ago 289MB
debian                            latest       2b98c9851a37   2 months ago 100MB

REPOSITORYのところが<none>のイメージがいくつか出てくると思います。
これ、ゴミです。
どのコンテナからも利用されていなくて、しかもdocker build -tとかで新しく作ったイメージにREPOSITORY名をほかのイメージに割り当ててしまったので
イメージとしては存在しているけれど名前がない状態になっています。

これを消します。

docker images -f 'dangling=true’ -q | xargs -n 1 docker rmi

このコマンドでREPOSITORYがのイメージを一括削除出来ます。

$ docker images -f 'dangling=true' -q | xargs -n 1 docker rmi
Deleted: sha256:c4a0d4e62e283edb45934825783689238f13f1c46a676f198e48ad3312f6b731
Deleted: sha256:0983a6ff44939438b44f20b2e90a39fe5d57c32863acf509696fdbf5c2ec3aa3
Deleted: sha256:ae872920f79994777b850b58ca0bc9d7650edbb303d649e5ba0198bcd2c32206
Deleted: sha256:92803c2bae2f6901ad8b54bd8f3386d2750b404cea8680e3b6216d2c4b2669cb
Deleted: sha256:98932b65a452e5d6a513446fdd8f757f03d3bbd15054aa6f69eebdb2f6c89d83
Deleted: sha256:9ceee271a2cac49586c3b0d6af24c7c567a36c6f792a9ae111597ff6fd8b2430
Deleted: sha256:8d8c5d5043487e115ee1923c1a5c1e80a2c26c0c5db0b7aadbf358874ed502c9
Deleted: sha256:fe0966cee93c5c3c3e75f1ddaa71fbf5dbb3e9ae43625733cce2fe79adbfbf75
Deleted: sha256:8f9d8f5e1127e7c56d28d2351f77f2e6493d1f7bde25c50308a950220b280491
Deleted: sha256:71e5958836548106da3c135d5d31a55c1bd78e2e965aad997eaee025b6ea498a
Deleted: sha256:bd5519713b98a3e423e93f72e74368d8bf145b72622b92502e31125e4bec94df
Deleted: sha256:c4950f142a0d6f33bca517542221c01aa96c8f7789c8d9d3332cac720f851b80

最後にDockerを再起動して終わりです。

ついでに、このコマンドを以下のようにalisas登録しちゃいます。

alias docker-clean-images="docker images -f 'dangling=true' -q | xargs -n 1 docker rmi"

参考になりましたでしょうか。