教你如何清理 Docker 存储驱动的磁盘占用空间

docker-ct

Author:rab


有时候你会发现,你的 Docker 业务容器虽然做了数据持久化,且数据持久化的磁盘空间占用并不大,但是 Docker 的 Overlay2 目录占用却很大。我们知道 Overlay2 是 Docker 的存储驱动,也是 Docker 默认的存储驱动,其实现了 Docker 的镜像层和容器层的分层存储技术。那为什么 Overlay2 磁盘空间占用较大呢?原因可能有以下几个方面:

  • 容器镜像层叠加

    Overlay2 存储驱动使用了层叠的方式来管理容器镜像。每个容器都有自己的镜像层,当多个容器使用相同的基础镜像时,它们会共享相同的底层镜像层。这种层叠的方式可以节省磁盘空间,但也会导致存储占用增加。

    怎么理解呢?因为每个容器的可写层会保存容器所做的所有更改,包括新增的文件和修改的文件。如果有多个容器使用相同的只读镜像层,那么每个容器的可写层都会保存一份相同的文件副本,从而增加了存储空间的占用。

  • 镜像更新和删除

    当容器镜像被更新或删除时,Overlay2 存储驱动会保留旧的镜像层,并创建新的镜像层。这样做是为了保证容器的可回滚性。然而,这也会导致存储占用增加,特别是在频繁更新或删除容器镜像时。

  • 存储驱动的限制

    Overlay2 存储驱动在某些情况下可能会受到存储驱动本身的限制,例如文件系统的最大文件数或最大文件大小。如果容器中的文件数量或文件大小超过了存储驱动的限制,那么存储占用可能会增加。

接下来列举一些实际生产中常用的无用数据清理方法,具体看以下案例。

1、清理无用的容器

使用以下命令删除已经停止的容器

如果后续确定已经不启动已经停止的容器了,则执行该命令

docker container prune

2、清理无用的镜像

docker image prune        # 删除Tag为<none>的镜像(强制删除-f)
docker image prune -a     # 删除未被任何容器使用的镜像(包括Tag为<none>的镜像)

3、清理无用的数据卷

使用以下命令删除未被任何容器使用的数据卷

docker volume prune

4、清理无用的网络

使用以下命令删除未被任何容器使用的网络:

docker network prune

5、清理无用的构建缓存

使用以下命令删除无用的构建缓存

docker builder prune

6、清理无用的存储驱动数据

使用以下命令清理存储驱动的临时数据

此操作会删除如下图中列举的所有数据项:

  • 所有已经停止的容器;
  • 所有未被任何容器使用的网络;
  • 所有未被任何容器使用的数据卷;
  • 所有悬空镜像(当多次构建时使用了相同镜像名与 Tag 名时就会产生);
  • 所有悬空镜像产生的构建缓存。
docker system prune --volumes   # 其实就是前5条指令的结合

image-20230918115049251

需要注意的时,执行上述命令将删除未使用的资源,包括容器、镜像、数据卷、网络和构建缓存。确保在执行这些命令之前,再次确认不再需要这些资源,并且已经备份了重要的数据。

—END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值