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