Docker清理缓存

本文详细介绍了如何管理 Docker 占用的磁盘空间。通过 docker system df 命令可以查看磁盘使用情况,并使用 docker prune 系列命令删除未使用的容器、镜像、卷和网络。此外,文章还提供了针对构建缓存和网络的清理方法。

在日常使用 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 的磁盘空间管理需要谨慎操作。在执行删除命令前,务必确认要删除的对象,以免误删重要数据。

使用 Hugo 构建
主题 StackJimmy 设计