在日常使用 Docker 的过程中,Docker 组件(镜像、容器、卷、构建缓存等)会占用大量的磁盘空间,Docker会将构建缓存、容器、图像和卷持久保存到磁盘。随着时间的推移,这些内容可能会占用系统上的大量空间。在这篇文章中,我们将介绍可能占用系统空间的 Docker 工件、如何单独清除它们,以及如何使用 docker system prune 来清除 Docker 缓存。
一.查看Docker 使用了多少磁盘空间?
首先了解一下 Docker 的磁盘使用情况。我们可以使用该docker system df命令来了解各种工件占用了多少磁盘空间。
docker system df
输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 138 34 36.18GB 34.15GB (94%)
Containers 74 18 834.8kB 834.6kB (99%)
Local Volumes 118 6 15.31GB 15.14GB (98%)
Build Cache 245 0 1.13GB 1.13GB
Docker 占用 36.18 GB 用于镜像,834.8 kB 用于容器,15.31 GB 用于本地卷,1.13 GB 用于 Docker 构建缓存。总共约 50 GB 的空间,其中很大一部分是可回收的。
二、如何收回空间?
1.删除未使用的容器
我们可以删除所有已停止的容器以节省磁盘空间。
- 查看未使用的容器
在删除之前,我们可以先查看哪些容器未使用。我们可以通过运行docker ps 带有容器状态过滤器的命令来查看未使用容器的 ID 。如果容器的状态为exited或dead,则表示容器未使用。
docker ps --filter status=exited --filter status=dead -q
11bc2aa92622
355901f38ecb
263e9bde1f24
注意:如果我们想知道未使用的容器的大小,我们可以用 -s替换标志-q来获取有关容器的大小和元数据。
- 删除未使用的容器
现在可以使用docker rm ID 来删除单一容器,或者使用docker container prune 来删除所有未使用的容器。
docker container prune -f
Deleted Containers:
399d7e3679bf9b14a1c7045cc89c056f2efe31d0a32f186c5e9cb6ebbbf42c8e
Total reclaimed space: 834.6kB
我们可以添加-f参数,以便在删除前省略确认提示。
三、删除图像
Docker image 会占用大量磁盘空间。例如,当基础镜像发生变化时,我们会累积新镜像,或者通过docker build构建新镜像。同样我们可以使用 docker rmi ID 删除单一图像,或者我们可以使用该docker image prune命令从系统中删除未使用的镜像。
默认情况下,docker image prune -f 只会删除与任何容器无关且没有标签的悬空图像。
docker image prune -f
Deleted Images:
deleted: sha256:6f096c9fa1568f7566d4acaf57d20383851bcc433853df793f404375c8d975d6
...
Total reclaimed space: 2.751GB
通过删除悬空图像,我们回收了超过 2.7 GB 的空间。但是,如果我们回顾一下命令的输出docker system df,我们还有 34.15 GB 的可回收图像。
剩余的空间来自哪里?这些是系统上标记或与容器关联的图像。我们可以运行命令docker image prune- a强制删除这些图像,假设它们是未使用的图像。
docker image prune -a -f
Deleted Images:
untagged: k8s.gcr.io/etcd:3.4.13-0
untagged: k8s.gcr.io/etcd@sha256:4ad90a11b55313b182afc186b9876c8e891531b8db4c9bf1541953021618d0e2
deleted: sha256:0369cf4303ffdb467dc219990960a9baa8512a54b0ad9283eaf55bd6c0adb934
deleted: sha256:f3cecccfe2bea1cbd18db5eae847c3a9c8253663bf30a41288f541dc1470b41e
Total reclaimed space: 22.66GB
通过这种方式,我们删除了所有与容器不相关的未使用的图像,而不仅仅是悬空的图像。
四、删除卷
Docker 永远不会自动清理卷,因为它们可能包含有价值的数据。但是,如果我们知道不再需要卷中的数据,我们可以docker volume prune命令将其删除。这将删除所有未被任何容器使用的匿名卷。
docker volume prune -f
Total reclaimed space: 0B
有趣的是,我们发现没有回收任何空间。这是因为我们有与容器关联的卷。我们可以通过运行命令来查看这些卷。
docker volume ls。
DRIVER VOLUME NAME
local 0a44f085adc881ac9bb9cdcd659c28910b11fdf4c07aa4c38d0cca21c76d4ac4
local 0d3ee99b36edfada7834044f2caa063ac8eaf82b0dda8935ae9d8be2bffe404c
...
我们得到一个显示驱动程序和卷名称的输出。该命令docker volume prune仅删除匿名卷。这些卷没有命名,也没有来自容器外部的特定来源。我们可以使用该docker volume prune -a -f命令删除所有卷。
docker volume prune -a -f
Deleted Volumes:
c0c240b680d70fffef420b8699eeee3f0a49eec4cc55706036f38135ae121be0
2ce324adb91e2e6286d655b7cdaaaba4b6b363770d01ec88672e26c3e2704d9e
Total reclaimed space: 15.31GB
五、删除构建缓存
要删除 Docker 构建缓存,我们可以运行命令docker buildx prune来清除默认构建器的构建缓存。
docker buildx prune -f
ID RECLAIMABLE SIZE LAST ACCESSED
pw11qgl0xs4zwy533i2x61pef* true 54B 12 days ago
y37tt0kfwn1px9fnjqwxk7dnk true 0B 12 days ago
sq3f8r0qrqh4rniemd396s5gq* true 154.1kB 12 days ago
Total: 5.806GB
如果我们想要删除特定构建器的构建缓存,我们可以使用该–builder标志来指定构建器名称。
docker buildx prune --builder builder-name -f
六、删除网络
虽然 Docker 网络不会占用我们机器上的磁盘空间,但它们会创建网桥、iptables 和路由表条目。因此,与其他工件类似,我们可以使用命令删除未使用的网络以docker network prune进行清理。
docker network prune -f
Deleted Networks:
test-network-1
七、一键删除所有未使用内容
我们可以通过运行docker system prune 来一键删除 Docker 生成的所有未使用的组件。这将删除所有未使用的容器、图像、网络和构建缓存。
docker system prune -f
Deleted Images:
deleted: sha256:93477d5bde9ef0d3d7d6d2054dc58cbce1c1ca159a7b33a7b9d23cd1fe7436a3
Deleted build cache objects:
6mm1daa19k1gdijlde3l2bidb
vq294gub98yx8mjgwila989k1
xd2x5q3s6c6dh5y9ruazo4dlm
Total reclaimed space: 419.6MB
默认情况下,Docker prune 不会删除卷,只会删除悬空的 Docker 镜像。我们也可以使用该–volumes标志来删除卷。我们还可以再次添加-a该标志以删除所有与容器无关的卷。
docker system prune --volumes -af
总结
本文详细介绍了如何管理 Docker 占用的磁盘空间。通过 docker system df 命令可以查看磁盘使用情况,并使用 docker prune 系列命令删除未使用的容器、镜像、卷和网络。此外,文章还提供了针对构建缓存和网络的清理方法。合理利用这些命令,可以有效释放磁盘空间,提高系统性能。建议在日常使用 Docker 时,养成定期清理的习惯,并根据实际情况选择合适的清理命令。Docker 的磁盘空间管理需要谨慎操作。在执行删除命令前,务必确认要删除的对象,以免误删重要数据。