Dockerお掃除大作戦
こんにちは。
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"
参考になりましたでしょうか。