本地或测试环境使用 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. .NET程序启动就报错,如何截获初期化时的问题json

    一:背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候,程序一跑就报错,截图如下: 从给出的错误信息看大概是因为json格式无效导致的,在早期的训练营里曾经也有一例这样的报错,最后定位下来是 ...

  2. c++并发编程实战-第3章 在线程间共享数据

    线程间共享数据的问题 多线程之间共享数据,最大的问题便是数据竞争导致的异常问题.多个线程操作同一块资源,如果不做任何限制,那么一定会发生错误.例如: 1 int g_nResource = 0; 2 ...

  3. 用C#将多个jpg合成一个pdf

    nuget安装iTextSharp: static void MergePDF(string picPath,string pdfPath) { string[] picFileNames=Direc ...

  4. codeup之奖金计算

    codeup c2奖金计算 Description 某企业发放的奖金根据利润提成.利润I低于或等于100000时,奖金可提10%:利润高于100000元,低于200000元(100000<I&l ...

  5. Win32汇编学习笔记05

    定位关键点3种方法: 过程函数 api 字符串 但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的 窗口程序看控件信息 1.通过OD去看 还可以用 spy ++ 查 ...

  6. L1-1、Prompt 是什么?为什么它能“控制 AI”?

    *--Prompt 入门 L1-1 想象一下,你只需输入一句话,AI 就能自动为你写一篇文案.生成一份报告.甚至规划你的创业计划.这种"对话即编程"的背后魔法,就是 Prompt ...

  7. MCP Server On FC 之旅第四站: 长连接闲置计费最高降低87%成本的技术内幕

    函数计算( FC )是阿里云事件驱动的全托管计算服务, 使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码或镜像.函数计算为您准备好计算资源,弹性地.可靠地运行任务,并提供日志查询.性 ...

  8. Java 下载网络资源

    从网络URL下载文件到指定目录,自适应文件类型,并且重命名下载后的文件名.这里使用XtremePapers如下URL的网络资源作为测试文件: https://papers.xtremepape.rs/ ...

  9. Springboot笔记<11>面向切面编程AOP

    面向切面编程AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中 ...

  10. 一个基于 .NET 8 + Ant Design Blazor 开发的简洁现代后台管理框架

    前言 今天大姚给大家分享一个基于 .NET 8 + Ant Design Blazor 开发的简洁现代后台管理框架:Caviar. 项目介绍 Caviar 是一个基于 .NET 8 + Ant Des ...