Dockerで不要ストレージを削除する
Dockerの設定方法やトラブルシューティングについては下記などで説明されています。
後者のドキュメント中のDocker デーモンの設定に以下の記載があります。記載の通り、Dockerの設定をカスタマイズしたい場合は「/etc/docker/daemon.jsonを新規作成して設定する」という方法があります。
Docker デーモンを JSON ファイルで設定するには、Linux システム上では /etc/docker/daemon.json にファイルを作成するか、Windows 上では C:\ProgramData\docker\config\daemon.json を作成します。Mac OS ではタスクバーの鯨アイコンから Preferences > Daemon > Advanced を選択します。
/etc/docker/daemon.jsonを作成していない場合、デフォルトでDockerはコンテナイメージなどを「/var/lib/docker」ディレクトリ配下に保存します。不要なコンテナイメージやボリュームが貯まっていくとストレージを圧迫してしまいます。今回は不要になったDocker関連ストレージを削除する方法をメモします。
検証環境¶
| 対象 | バージョン |
|---|---|
| Ubuntu | 24.04.3 LTS |
| Docker | 29.0.2 |
Dockerのデフォルト設定¶
Dockerの設定値はdocker system infoで確認することができます。私の検証環境では以下のように表示されました。
# docker system info
Client: Docker Engine - Community
Version: 29.0.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.30.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.40.3
Path: /usr/libexec/docker/cli-plugins/docker-compose
model: Docker Model Runner (Docker Inc.)
Version: v1.0.1
Path: /usr/libexec/docker/cli-plugins/docker-model
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 29.0.2
Storage Driver: overlayfs
driver-type: io.containerd.snapshotter.v1
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
CDI spec directories:
/etc/cdi
/var/run/cdi
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: fcd43222d6b07379a4be9786bda52438f0dd16a1
runc version: v1.3.3-0-gd842d771
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.8.0-88-generic
Operating System: Ubuntu 24.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.62GiB
Name: localhost
ID: 8d78b7f7-4453-4afc-9705-701068a9d9ff
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
::1/128
127.0.0.0/8
Live Restore Enabled: false
Firewall Backend: iptables
Docker Root Dir: /var/lib/dockerと表示されています。まだコンテナイメージの取得(pull)などを実行していないデフォルト状態でこのディレクトリを確認すると以下の構造になっていました。
# tree /var/lib/docker/
/var/lib/docker/
├── buildkit
│ ├── cache.db
│ ├── containerd-overlayfs
│ │ ├── cachemounts
│ │ ├── metadata_v2.db
│ │ └── workerid
│ ├── executor
│ └── history_c8d.db
├── containers
├── engine-id
├── network
│ └── files
│ └── local-kv.db
├── plugins
│ └── tmp
├── runtimes
├── swarm
├── tmp
└── volumes
├── backingFsBlockDev
└── metadata.db
14 directories, 8 files
Dockerが利用しているストレージ容量の確認¶
Dockerが利用しているストレージ状況はdocker system dfで確認できます。
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 12 15.81GB 1.751GB (11%)
Containers 14 14 554.7MB 0B (0%)
Local Volumes 9 2 29.73GB 29.73GB (99%)
Build Cache 28 0 1.009GB 1.009GB
不要ストレージの一括削除¶
docker system prune --all --forceを実行することで「利用していないイメージ・ボリューム・ネットワーク」などを一括削除できます。実行前後の比較は以下です。
実行前¶
例えばImagesの合計は15ですが、アクティブなものは12と乖離があります。Build Cacheも同様に合計/アクティブに乖離があります。「乖離がある」ということは「未使用なものがある」と言い換えることができます。
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 12 15.81GB 1.751GB (11%)
Containers 14 14 554.7MB 0B (0%)
Local Volumes 9 2 29.73GB 29.73GB (99%)
Build Cache 28 0 1.009GB 1.009GB
実行後¶
docker system prune --all --forceを実行するとImagesとBuild Cacheの合計/アクティブは数字が同じになりました。未使用なものを削除しましたので、ストレージ使用量も削減されています。
# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 12 14.23GB 160.8MB (1%)
Containers 14 14 554.7MB 0B (0%)
Local Volumes 9 2 29.73GB 29.73GB (99%)
Build Cache 0 0 0B 0B
参考¶
docker system --help¶
# docker system --help
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.
docker system df --help¶
# docker system df --help
Usage: docker system df [OPTIONS]
Show docker disk usage
Options:
--format string Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about
formatting output with templates
-v, --verbose Show detailed information on space usage
docker system prune --help¶
# docker system prune --help
Usage: docker system prune [OPTIONS]
Remove unused data
Options:
-a, --all Remove all unused images not just dangling ones
--filter filter Provide filter values (e.g. "label=<key>=<value>")
-f, --force Do not prompt for confirmation
--volumes Prune anonymous volumes