Docker は気軽にイメージを作って気軽にコンテナを動かせる。
あまりにも楽にできるので、気軽にやりすぎると、ときどきディスクを使い果たしてしまう。
そんな時はさすがにいらないイメージや、使わない中間コンテナを削除する。
よく挙げられてるやつ
コンテナの削除
$ docker ps -aq | xargs docker rm
イメージの削除
$ docker images -aq | xargs docker rmi
宙ぶらりんのボリュームの削除
$ docker volume ls -qf dangling=true | xargs docker volume rm
面倒
毎度これを打っていたので、次第に面倒になって、ホストの cron に仕掛けようかと思った。
しかし「ホストマシンの cron に仕掛ければいいじゃん」みたいなのは、なんだか Docker らしくない解決方法に感じる。
なので、この削除の処理をさらに Docker コンテナとして実行したいと思った。
誰しも同じようなことを考えるもので、既にそれを spotify が作っていたらしい。
spotify/docker-gc
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker martin/docker-cleanup-volumes
これを実行するだけ。
やばい。楽。
自分は Jenkins 経由でこれを各 Docker Host で実行している。
sock をマウントしてるけど?
UNIX Socket 経由でホストの Docker と通信できるので、いろいろ応用ができそうだ。
自分が知らなかっただけで、
どうやら Docker で Docker を管理したり、 Docker ホスト内全体の文脈に影響を与えたりするケースでは典型的な手法らしい。
後に自分が知ったうちでは、他にも次のイメージがその仕組みを使っていた。
gliderlabs/registrator ... Docker のコンテナを Consul に自動で追加する
gliderlabs/resolvable ... Docker のホストレベル DNS 解決
gliderlabs/connectable ... Proxy で Docker Host をつなぐ
たぶん他にもたくさんある。
ちょっと感動した話。
なお
当然ではあるけど、やはりこれも Docker イメージである以上は、
ディスクフルになってからでは docker pull するスペースもなく、この方法では失敗する。
ディスクフルを起こすまえにちゃんと監視をして、定期的に削除したほうが良い。
Volume Only Container 利用時の注意点 (2016 年 4 月 12 日追記)
超軽量 Docker Image true (125 bytes) と sleeping-beauty (129 bytes) にも記載したが、
このコマンドは無慈悲にも停止中の全コンテナを消そうとするので、注意しなくてはならない。
tianon/true
のような、『起動して成功してすぐに止まる』コンテナが犠牲になる。
Volume Only Container や Data Only Container (単にデータコンテナとも) でよくある話だと思う。
このような場合は、
- 自動削除 (
docker-gc
) をそもそもしない - Docker ホストに直接置く
- データコンテナは終了させずに何らかのコマンドで常に起動しておく (上記の記事中にあるとおり sleeping-beauty を使うなど)
などの手段を講じるとよいだろう。