Dockerお掃除大作戦

こんにちは。
gendosuです。

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

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

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

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

docker system df コマンド

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

このような感じですね。

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

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

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

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

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

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

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

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

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

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

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

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

これを消します。

docker rmi $(docker images -f “dangling=true” -q)

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

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

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