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"
参考になりましたでしょうか。