本地或测试环境使用 Docker 时,常出现 Docker 占用磁盘空间大,导致系统磁盘资源不足等问题。基于此,总结了 Docker 磁盘占用分析及清理方法。

一、分析方法

1. 使用 docker system 分析占用整体分布

[root@linux7 data]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 181 81 182.2GB 131.9GB (72%)
Containers 349 23 565GB 156.7GB (27%)
Local Volumes 91 37 4.706GB 2.67MB (0%)
Build Cache 11 0 199.7MB 199.7MB [root@linux7 data]# docker system df -v # -v 输出分布明细

(1)TYPE:表示 Docker 资源类型,包括 Images(镜像文件)、Containers(容器)、Local Volumes(本地数据卷)和 Build Cache(构建缓存)。

(2)TOTAL:表示该类型资源的总数量。

(3)ACTIVE:表示当前正在使用的资源数量。

(4)SIZE:表示该类型资源占用的磁盘空间总量。

(5)RECLAIMABLE:表示未占用可以回收的磁盘空间大小及百分比。

2. 分析各类资源具体占用

(1)查看镜像占用并其排序

[root@linux7 data]# docker images --format "{{.Repository}}:{{.Tag}}\t{{.Size}}" | sort -k 2 -h -r

(2)查看容器占用并其排序

[root@linux7 data]# docker ps -a --format "{{.ID}}\t{{.Names}}\t{{.Size}}" | sort -k 3 -h -r

(3)查看卷占用

[root@linux7 data]# docker volume ls # 查看卷占用

[root@linux7 data]# docker volume inspect <VOLUME_NAME>  # 查看具体卷详情

[root@linux7 data]# du -sh <MOUNT_POINT> #查看卷真实占用磁盘大小

二、清理方法

1. 清理未运行的容器

(1) 列出所有容器

[root@linux7 data]# docker ps
CONTAINER ID IMAGE COMMAND STATUS NAMES
a1b2c3d4e5f6 nginx:latest "nginx -g" Exited my-nginx [root@linux7 data]# docker ps -a # -a 输出所有容器,含已停止

(2) 清理指定容器

[root@linux7 data]# docker rm <CONTAINER_ID>  # 清理已停止的容器

[root@linux7 data]# docker rm -f <CONTAINER_ID>  # 强制清理(运行中的容器也会被停止并清理)

(3) 清理所有已停止的容器

[root@linux7 data]#  docker container prune # 清理所有处于停止状态的容器

[root@linux7 data]#  docker container prune -f # 强制清理所有处于停止状态的容器,跳过确认

[root@linux7 data]#  docker container prune --filter "until=24h" # 仅清理 24 小时前停止的容器

2. 清理未使用的镜像

(1) 列出所有镜像

[root@linux7 data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest abc123456 2 weeks ago 133MB
ubuntu 20.04 def789012 1 month ago 72.8MB

(2) 清理指定镜像

[root@linux7 data]# docker rmi <IMAGE_ID>  # 按 ID 清理

[root@linux7 data]# docker rmi -f <IMAGE_ID> # 强制清理(即使被容器引用)

[root@linux7 data]# docker rmi nginx:latest  # 按名称清理

(3) 清理所有未使用的镜像

命令格式:docker image prune [OPTIONS],默认情况下会清理所有未被容器引用的悬空镜像(dangling images)。

常用选项:

-a, --all:清理所有未被使用的镜像,含悬空镜像。

-f, --force:不提示确认,直接清理。

--filter:支持条件过滤需清理的镜像。

--dry-run:仅显示将要清理的镜像,不实际执行清理。

使用示例:

[root@linux7 data]# docker image prune # 清理悬空镜像

[root@linux7 data]# docker image prune -a # 清理所有未被使用的镜像,含悬空镜像

[root@linux7 data]# docker image prune -af # 强制清理不提示确认

[root@linux7 data]# docker image prune --filter "until=24h" # 使用过滤器清理

[root@linux7 data]# docker image prune --dry-run # 仅显示将要清理的镜像,不实际执行清理,清理操作不可逆,【建议】先使用`--dry-run`查看将要清理的镜像

3. 清理未使用的网络

(1) 列出所有网络

[root@linux7 data]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9e14a4176c29 bridge bridge local
65b36b928672 host host local
99c1c095900c none null local [root@linux7 data]# docker network inspect host # 查看

(2) 清理指定网络

[root@linux7 data]# docker network rm <NETWORK_ID | NAME> <NETWORK_ID | NAME>  # 清理已停止的网络

(3) 清理所有已停止的网络

[root@linux7 data]# docker network prune

4. 清理 Docker 所有未使用的资源

docker system prune 是 Docker 提供的系统级清理命令,主要用于清理不再使用的 Docker 对象(悬空资源)。

清理范围:

(1)停止的容器

(2)未被任何容器引用的网络

(3)悬空的镜像(未被标记且未被任何容器引用的镜像层)

(4)悬空的构建缓存

参数详解:

(1)--all / -a:清理所有未使用的镜像(而不仅仅是悬空镜像)

(2)--force / -f:跳过确认提示直接执行清理

(3)--volumes:清理未被容器使用的卷,务必谨慎

(4)--filter:按条件过滤要删除的对象

示例:

[root@linux7 data]# docker system prune # 标准清理

[root@linux7 data]# docker system prune -a -f # 强制清理所有未使用资源

[root@linux7 data]# docker system prune --volumes # 清理未被容器使用的卷,务必谨慎

[root@linux7 data]# docker system prune --filter "until=48h" # 清理超过 48 小时未被使用的资源。

三、相关知识点

1. 悬空镜像(Dangling Images)

(1)定义:指没有标签且没有被任何容器引用的镜像层。

(2)特征:通常显示为<none>:<none>的镜像。

(3)查看方法:

[root@linux7 data]# docker images -f "dangling=true"

(4)产生场景:

多阶段构建时的中间镜像:当使用 Dockerfile 进行多阶段构建时,每个FROM语句都会产生一个中间镜像。构建完成后,这些中间镜像会变成悬空状态。

构建失败残留:构建过程中如果失败,可能会留下未完成的镜像层,这些也会成为悬空镜像。

重新构建同名镜像:当构建一个与现有镜像同名但不同内容的新镜像时,旧镜像会失去标签变成悬空镜像。

镜像标签变更:使用docker tag命令修改镜像标签后,原镜像如果没有其他标签引用,就会变成悬空镜像。

使用docker commit创建新镜像:基于容器创建新镜像后,原基础镜像如果没有其他引用,可能变成悬空状态。

2. 未使用镜像(Unused Images)

(1)定义:指当前没有被任何容器使用的镜像(无论是否有标签),所以所有悬空镜像都属于未使用镜像。

(2)特征:可能有明确的镜像标签;但没有任何运行或停止的容器基于该镜像。

Docker 磁盘占用分析和清理方法的更多相关文章

  1. Docker磁盘空间分析与清理

    首先使用du命令逐层分析docker磁盘的使用情况: (base) [root@openvino docker]# du -h --max-depth=1 | sort 0 ./containerd ...

  2. docker空间管理之清理磁盘占用

    1.docker部署后修改数据存放目录,默认存放到/var/lib/docker下面,修改到一个大的空间目录下面.参考我的另外一篇博客:https://www.cnblogs.com/cuishuai ...

  3. [转帖]Docker 清理占用的磁盘空间

    Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.html docker system docker ...

  4. Docker(二十七)-Docker 清理占用的磁盘空间

    1. docker system命令 docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况: docker system dfTYPE TOTAL A ...

  5. [自学]Docker system 命令 查看docker镜像磁盘占用情况 Docker volume 相关

    内容From https://docs.docker.com/engine/reference/commandline/system_df/ docker的image和docker的container ...

  6. docker 磁盘清理 相关

    用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响. 本文先对 Docker 的空间分析与清理进行说明,然后对 ...

  7. Docker 工作原理分析

    docker 容器原理分析 docker 的工作方式 Namespace 容器对比虚拟机 Cgroups 容器看到的文件 Mount namespace chroot rootfs Volume(数据 ...

  8. Linux磁盘空间分析及清理(df、du、rm)

    1.df磁盘空间查看 df可以查看一级文件夹大小.使用比例.档案系统及其挂入点. [root@oms ~]# df -Th Filesystem Type Size Used Avail Use% M ...

  9. Docker源码分析(九):Docker镜像

    1.前言 回首过去的2014年,大家可以看到Docker在全球刮起了一阵又一阵的“容器风”,工业界对Docker的探索与实践更是一波高过一波.在如今的2015年以及未来,Docker似乎并不会像其他昙 ...

  10. Docker源码分析(七):Docker Container网络 (上)

    1.前言(什么是Docker Container) 如今,Docker技术大行其道,大家在尝试以及玩转Docker的同时,肯定离不开一个概念,那就是“容器”或者“Docker Container”.那 ...

随机推荐

  1. 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常. 我们知道 i.MXRT 系列本身并没有片内非易失 ...

  2. java基础之“在后端使用爬虫Jsoup工具根据标签id获取字符串中的标签html代码(java后端实现前端根据标签id获取标签对象)”

    一.场景 在电商项目中产品描述时必不可少的存在,每个不同的项目所需的描述不同,不能一概而论 在产品的描述中的部分数据是我们所需要的,如价格,尺码表等 如何在不依靠前端的前提下,完成数据的提取就成了问题 ...

  3. c++单例模式总结

    分类 懒汉式:实例对象在第一次被使用时才进行初始化. 饿汉式:实例在定义时就被初始化. 特点 1.构造函数和析构函数私有化,不允许外部创建实例对象. 2.拷贝构造函数和复制运算符重载被delete,不 ...

  4. 【工程应用十】 基于Hessian矩阵的Frangi滤波算法 == 血管图像增强 == Matlab中fibermetric函数的自我实现、加速和优化。

    前几天在翻一翻matlab中的帮助文档,无意中发现一个叫fibermetric的图像处理函数,感觉有点意思,可以增强或者说突出一些类似于管状的对象,后面看了下算法的帮助文档,在百度上找了找,原来这也是 ...

  5. K8s新手系列之指定Pod调度到指定节点上

    概述 在 Kubernetes 中,Pod的调度是通过kube-schedule来实现的,Pod的调度会经过一系列算法来进行完成. 在实际生产过程中,我们想让Pod调度到我们想要的节点上,往往通过ku ...

  6. 爬虫1——urllib的使用

    一.什么是爬虫 1.爬虫Spider的概念 爬虫用于爬取数据,又称之为数据采集程序. 爬取的数据来源于网络,网络中的数据可以是由WEB服务器(Nginx/Apache),数据库服务器(MySQL.Re ...

  7. Chocolate

    提供一种比较清新的做法. 思路:贪心. 思考:如果在巧克力上横向切一刀,那么纵向要切的刀数就会加一.如果在巧克力上纵向切一刀,那么横向要切的刀数就会加一. 结论:要先切代价大的,再切代价小的. 做法: ...

  8. DeepSeek + Mermaid:零代码玩转专业流程图

    一.工具组合超能力解析 黄金组合优势: 语言到图表的直接转换 - 用中文描述即可生成专业图表 动态修正能力 - 实时调整描述立即更新图表 企业级复杂度支持 - 轻松处理多层级流程 零安装成本 - 纯W ...

  9. 聊一聊 Linux 上对函数进行 hook 的两种方式

    一:背景 1. 讲故事 前两篇我们介绍了 Minhook 在 Windows 平台上的强大功效,这一篇我们来聊一聊如何在 Linux 上对函数进行hook,这里介绍两种方式. 轻量级的 LD_PREL ...

  10. 树结构Tree

    树结构 平衡顺序二叉树 通过平衡顺序二叉树查数据的时候,也就等同于二分查找的操作 Binary Search 2,3树 二三树 二三树有 node2 和 node3 两种节点,树的规则如图 2-3-4 ...