Docker使用/var/lib/docker存储镜像、容器和本地命名卷。删除此内容可能导致数据丢失并可能停止引擎运行。特别是overlay2子目录包含了镜像和容器的各种
文件系统层。
要清理未使用的容器和镜像,请参见
docker system prune
。还有一些选项可以删除卷甚至已标记的镜像,但默认情况下它们不启用,因为可能会导致数据丢失。
$ 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 volumes
梅干永远不会删除以下内容:
- 正在运行的容器(使用
docker ps
列出它们)
- 这些容器上的日志(有关限制日志大小的详细信息,请参见此帖子)
- 由这些容器进行的文件系统更改(可通过
docker diff
查看)
此外,任何在正常docker文件夹之外创建的内容可能无法在此垃圾回收期间被docker看到。这可能来自其他应用程序向此目录写入,或者是docker引擎的先前配置(例如从AUFS切换到overlay2,或者在启用用户命名空间后可能发生)。
如果忽略此建议并删除类似于overlay2的单个文件夹,会发生什么?容器文件系统是从一组文件系统层组装而成的,overlay2文件夹是docker执行某些挂载的地方(当容器正在运行时,您将在mount
的输出中看到它们)。在使用时删除其中一些内容将从正在运行的容器中删除文件系统的某些块,并可能破坏从受影响镜像启动新容器的能力。请参见此问题以了解可能的结果之一。
为了完全刷新Docker到一个干净的状态,您可以删除整个目录,而不仅仅是像overlay2这样的子目录:
sudo -s
systemctl stop docker
rm -rf /var/lib/docker
systemctl start docker
exit
引擎将以完全空的状态重新启动,这意味着您将丢失以下所有内容:
docker image prune --all
和docker system prune -a
命令。这使我的磁盘空间回收了约50GB,原本这些文件存放在/var/lib/docker/overlay2
目录下。但是,仅运行docker system prune -a
命令就足够了。另外,我的配置信息如下:操作系统:Ubuntu 20
,Docker版本:19.03.12
。 - Binita Bharatidocker volume rm $(docker volume ls -qf dangling=true)
更多信息请参考此链接:https://dev59.com/tVYN5IYBdhLWcg3w7MC5#75928154 - lambodardocker system prune -a
是否真的能清除所有东西,你可以运行以下命令来查找被Docker忽略的文件夹。find /var/lib/docker/overlay2 -mindepth 1 -maxdepth 1 -type d \! -exec bash -c "docker ps -q | xargs docker inspect --format '{{.GraphDriver.Data}}'| grep -q "{} \; -print
请注意,这将识别出任何在正在运行的Docker镜像的GraphDriver中未提及的文件夹。你应该会找到一个名为l
的文件夹,其中包含了指向其他所有文件夹的链接列表。 - Tobi Oetiker