Docker使ってると気づいたらディスクがいっぱいになってたことありませんか?
私はあります。
そのたびに要らなくなったイメージを探して、消して、使ってないボリューム探して、消して、とかやってたのですが、つらくなってきたのでゴミ掃除的なコマンドを使うようになりました( docker system prune
とかね)。
でも、実はこのコマンドだけじゃ全てのゴミを掃除できません。
Docker環境には他にも色んなゴミが眠ってて、ある程度ヘビーに使おうとすると他の方法も組み合わせて使う必要があります。
ただし、消してはいけないデータも意図せず消してしまう危険もあるので、状況に応じて適切な方法でゴミ掃除しましょう。
本記事の読者として、以下のような方を想定しています。
- Dockerを使ったことがある
- イメージやコンテナなどの用語をとりあえず知っている
Dockerの資材
Dockerコンテナ周りの主な資材は以下があり、それぞれ使わなくなるとゴミができます。
資材 | ゴミの例 |
---|---|
イメージ | もう使わなくなったコンテナのイメージや古いイメージなど。 |
コンテナ | もう使わなくなって停止したコンテナなど。 |
ボリューム | コンテナが停止/削除されてアンマウントされたボリュームなど。 |
ネットワーク | もう使わなくなったネットワークなど。 |
図にすると以下のような感じです。
大事な点として、アプリエラーで停止しちゃったけど調査のために残しておきたいコンテナとか、
アンマウントしたけど運用データが入っているため残しておきたいボリュームなど、
運用によってゴミではないものもあります。
そのため、どのゴミ掃除コマンドでどこまで掃除されるか、をきちんと理解して使用する必要があります。
ゴミ掃除コマンド
dockerのコマンドでpruneオプションが使えるものがいくつかあり、それらをゴミ掃除コマンドと呼んでいます。
いろいろありますが、基本的には以下があれば私は大丈夫だと思います。
- 【コマンド1】 docker system prune [-f]
- 【コマンド2】 docker image prune -a [-f]
- 【コマンド3】 docker volume prune [-f]
シチュエーション
以下に、シチュエーションごとに使うとよいゴミ掃除コマンドを紹介します。
ただし、停止状態のコンテナも消えるため、コンテナでエラーが発生して停止したコンテナを調査する場合などは実行してはいけません。
a. コンテナ置き換えのあと
とりあえず以下のコマンドを順番に打っとけば大丈夫です。
-f
を付けると確認なしで実行されます。
- 【コマンド1】 docker system prune [-f]
- 【コマンド2】 docker image prune -a [-f]
これを実行すると以下が削除されます。
- すべての未使用コンテナ(停止状態など)
- すべての未使用ネットワーク(どのコンテナにも接続されていないものなど)
- どのコンテナのベースにもなっていないすべてのイメージ
(docker system pruneのExtended description
や docker image pruneのExtended description
を参照)
ボリュームは削除されないので運用データが消える心配はありません。
使っていないコンテナとかネットワークは、使う時にまた作ればいいので大丈夫。
アプリのバージョンアップなどでイメージが更新されたら、
新イメージでコンテナを作り直します。
すると、旧イメージが残るため、docker image prune
で消しています。
b. サービスを停止してDocker上の全ての資材を削除するとき
[a. コンテナ置き換えのあと]のコマンドの後に、docker volume prune
も実行するとよいです。
- 【コマンド1】 docker system prune [-f]
- 【コマンド2】 docker image prune -a [-f]
- 【コマンド3】 docker volume prune [-f]
これを実行すると以下が削除されます。
- すべての未使用コンテナ(停止状態など)
- すべての未使用ネットワーク(どのコンテナにも接続されていないものなど)
- どのコンテナのベースにもなっていないすべてのイメージ
- マウントされていないすべてのボリューム
(docker volume pruneのExtended description
を参照)
サービス停止時は、ボリュームに入った運用データも不要になります(どこかにバックアップはするかもしれませんが)。
したがって、コンテナ停止削除後、docker volume prune
でボリュームも削除しています。
以上!