解决误删docker目录/var/lib/docker/overlay2,导致容器build失败问题

 更新时间:2025年10月24日 09:03:46   作者:尤达c  
文章介绍了Docker的overlay2存储驱动,解释了其分层存储机制和节省空间的方式,删除/var/lib/docker/overlay2目录下的文件导致容器无法启动,通过重启Docker并使用`docker system prune`和`docker system prune -a`命令可以清理不必要的镜像、容器和网络,释放磁盘空间

服务器磁盘满了,查看本地docker目录下占用太多,需要清除下不用的文件腾出资源,删除了/var/lib/docker/overlay2 下的文件,导致重新启动容器失败,启动新容器例如hello-world也失败

docker的overlay2存储的是什么?为什么能有这么大的占用

查询官方说明,overlay2是docker使用的文件存储驱动,也就是说,在/var/lib/docker/overlay2目录下的文件都是docker使用的存储

overlay2是分层存储,每一层通过本层的md5作为文件夹名来命名,如果要存储的两个东西【比如两个镜像】的底层几层的内容是一样的,那他们的md5就也是一样的,通过md5核验,确认他们这几层是一样的之后,在overlay2中实际存储的时候,这几层就可以只存储一份,然后由这两个东西共用,来达到节省空间的目的。

/var/lib/docker/overlay2 目录是 Docker 存储驱动程序之一

  • Overlay2 的默认存储目录,用于保存 Docker 容器镜像和容器数据。
  • Overlay2 是一个基于内核的图层存储驱动程序,可以通过将多个只读层叠加到单个可写层来创建 Docker 容器。
  • Overlay2 驱动程序使用了基于 inode 的存储模型,它将不同的图层都挂载到相同的文件系统目录下,同时使用不同的命名空间来进行隔离。

在 /var/lib/docker/overlay2 目录下,每个容器都对应一个文件夹,文件夹的名称是由两个长随机字符串组成的,每个字符串对应一个不同的命名空间。其中一个字符串对应于 Overlay2 驱动程序的命名空间,它用于标识这个容器的图层;另一个字符串对应于挂载点的命名空间,用于在宿主机文件系统中创建一个目录,用于挂载这个容器的可写层。

每个容器的文件夹中包含多个子目录,其中最重要的是 diff 目录,它用于存储容器的可写层。当 Docker 容器需要修改文件时,Overlay2 驱动程序会将这些修改记录在 diff 目录下的文件中。除了 diff 目录,每个容器的文件夹中还包含 merged 目录、lowerdir 目录和 upperdir 目录,用于存储容器的只读层和可写层。

具体来说:

当 Docker 运行容器时,它会在 /var/lib/docker/overlay2 目录下为容器创建一个唯一的文件夹,其中包含了容器的文件系统的层级结构。

该文件夹的名称以 l 开头,后跟 64 个字符的十六进制字符串,这个字符串是该容器的唯一 ID,例如:

/var/lib/docker/overlay2/l4j4t4c3k3ck0ec13c4a5798d274b16523e86029292bfb9bb9c4a4a4c3d0e4b4

在这个目录中,Overlay2 存储了容器的所有文件系统层。

当容器启动时,Docker 会将这些层级结构组合在一起,形成容器的完整文件系统,使其看起来像是一个完整的文件系统,而实际上是由多个层级结构组合而成的。

解决办法

重启docker

systemctl restart docker

然后启动一个容器试试

如果问题不能完美解决

  • ps: 如果不重启docker 还是会同样报错
  • ps:也可以将docker系统目录/var/lib/docker/下的overlay2文件夹,整个删掉,再重启docker后,会自动创建出新的overlay2文件夹目录,里边存放所必须的文件。这个时候重新run容器就会成功

如何清理docker磁盘占用

docker system df # 可查看 Docker 所占用的空间:

其中 Images 表示镜像,Containers 表示容器,Local Volumes 表示本地卷,Build Cache 表示构建缓存。 

整体清理

可以通过 docker system prune 进行一次空间清理:

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

该操作会删除所有停止的容器,所有未被至少一个容器使用的网络,所有的 dangling 镜像(在构建镜像时产生的 tag 为 none 的镜像,没有和任何其他有 tag 的镜像有关联),所有的 dangling 构建缓存(和 dangling 镜像同理)。

更激进一点,还可以执行 docker system prune -a,该操作还会删除没有和运行中的容器有关联的镜像。

docker system prune -a # 

我们看到目录下被清空了

  • 镜像清理:
docker rm <image_name> [-f]
  • 容器清理:
docker container rm <containerid_or_name>
  • 网络清理:
docker network ls
docker network rm <net_work_name>
  • 数据卷清理:
docker volume ls
docker system prune -a --volumes # 是在 docker system prune -a的基础上删除所有未使用的卷。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker 删除镜像的实现

    Docker 删除镜像的实现

    本文主要介绍了Docker 删除镜像的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • docker中多阶段构建与单阶段构建的具体使用

    docker中多阶段构建与单阶段构建的具体使用

    本文主要介绍了docker中多阶段构建与单阶段构建的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • Jenkins Pipeline中Docker镜像构建与推送的常见问题及解决方案

    Jenkins Pipeline中Docker镜像构建与推送的常见问题及解决方案

    在现代 DevOps 实践中,Jenkins 作为一款流行的持续集成和持续交付(CI/CD)工具,被广泛应用于自动化构建、测试和部署流程,然而,在实际使用 Jenkins Pipeline 进行 Docker 镜像构建和推送的过程中,可能会遇到各种问题,本文将通过一个具体的案例给大家详细的介绍一下
    2025-01-01
  • Docker安装部署neo4j的实战过程

    Docker安装部署neo4j的实战过程

    Docker是一种容器化技术,可以在Linux系统上部署应用程序,下面这篇文章主要给大家介绍了关于Docker安装部署neo4j的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Dockerfile文本文件使用方法实例解析

    Dockerfile文本文件使用方法实例解析

    这篇文章主要介绍了Dockerfile文本文件使用方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 教你如何从正在运行的容器创建 Docker 映像

    教你如何从正在运行的容器创建 Docker 映像

    这篇文章主要介绍了如何从正在运行的容器创建 Docker 映像,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 在Docker容器中使用iptables时的最小权限的开启方法

    在Docker容器中使用iptables时的最小权限的开启方法

    这篇文章主要介绍了在Docker容器中使用iptables时的最小权限的开启方法的相关资料,需要的朋友可以参考下
    2017-01-01
  • docker容器存储清理删除所需命令和方法

    docker容器存储清理删除所需命令和方法

    这篇文章主要介绍了docker容器存储清理所需命令和方法,我在用docker安装的es使用过程中,发现内存占满了,我把全部的都删除掉了,但有时候数据我们必须要使用,所以不能全删,需要指定删除,下面就是一些docker容器存储清理所需的一些命令和方法,需要的朋友可以参考下
    2023-01-01
  • Dockerfile中yum install无法使用的问题及解决

    Dockerfile中yum install无法使用的问题及解决

    在使用Dockerfile自定义CentOS 7容器过程中,可能会遇到容器内无法使用yum命令的问题,首先,确认主机是否能联网,其次,检查在Dockerfile打包新容器时,容器是否能联网,若发现容器无法联网,一种解决方法是编辑/etc/docker/daemon.json文件
    2024-11-11
  • 如何下载docker日志到本地

    如何下载docker日志到本地

    这篇文章主要介绍了如何下载docker日志到本地问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论