箱のプログラミング日記。

えんじにあ奮闘記

【Docker】不要なコンテナやイメージを削除する

f:id:y_hakoiri:20191102121842j:plain

Dockerイメージを--no-cacheでbuildすることがよくあるのだけど、その度に新しいイメージが溜まっていき、未使用のイメージが結構溜まってしまっていたためメモ。

$ docker -v
Docker version 19.03.12, build 48a66213fe

未使用のコンテナを削除

まずはイメージを削除する前にコンテナを削除する。

コンテナの起動・停止にかかわらず、現時点で存在しているコンテナに紐づくイメージは削除ができないため、不要なイメージを削除する前に不要なコンテナを削除する必要がある。

$ docker container prune [OPTIONS]

※停止中のコンテナを全て削除

こちらのコマンドはEngineのAPIバージョンが1.25以上でないと使用できないようなのでバージョンを確認

$ docker version
Client: Docker Engine - Community
 Azure integration  0.1.10
 Version:           19.03.12
 API version:       1.40 # これ
 Go version:        go1.13.10
 Git commit:        
 Built:             Mon Jun 22 15:41:33 2020
 OS/Arch:           darwin/amd64
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12) 
  Go version:       go1.13.10
  Git commit:       
  Built:            Mon Jun 22 15:49:27 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.13
  GitCommit:        
 runc:
  Version:          1.0.0-rc10
  GitCommit:        
 docker-init:
  Version:          0.18.0
  GitCommit:        

1.40だったので使えそう。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N]

本当に消していい?と聞かれる。

確認が不要な場合はオプションとともに実行でOK

$ docker container prune --force

他にも--filterオプションが使えて、特定のtimestamp以前に作られたものだけ削除できたり、特定のラベルがついているorついていないコンテナのみ削除できたりする。

今回はあまり深掘りしないので詳しくは下記を参照

docker container prune | Docker Documentation

未使用のイメージを削除

未使用のイメージの一括削除コマンド。

$ docker image prune [OPTIONS]

こちらも同じくpruneが使える。

(pruneという英単語知らなかったので調べたら「切り落とす」的な意味があるらしい。)

オプションは先ほどと同様、--force--filter が使用できる。

加えて、-a(--all)オプションが使えるみたいで

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
$ docker image prune --all
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

この違い。

danglingとは

オプションなしで実行した場合の「danglingなイメージ」と--allオプションをつけて実行した場合の「1つ以上のコンテナに紐づいていない場合」の違いがわからなかったので調べてみたところ、

dangling = TAGがnoneのイメージ

だった。

つまり

  • docker image prune...タグがついていないイメージを削除。タグがついているものは削除しない
  • docker image prune --all...タグの有無に関わらず、コンテナに紐づいていないイメージは全て削除(タグがついていてもコンテナに紐づいていない場合は削除)

という違いらしい。

参考

docker container prune | Docker Documentation

docker image prune | Docker Documentation

docker images | Docker Documentation