Docker 磁盘占用分析和清理方法示例小结

 更新时间:2025年07月21日 08:54:25   作者:曾左  
本文介绍Docker磁盘占用分析与清理方法,涵盖镜像、容器、卷及构建缓存的资源排查,提供清理未使用资源的命令及选项,如docker system prune和docker image prune,并解释悬空镜像的产生原因及处理技巧,感兴趣的朋友一起看看吧

本地或测试环境使用 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 磁盘占用分析和清理方法的文章就介绍到这了,更多相关Docker 磁盘占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker compose idea CreateProcess error=2 系统找不到指定的文件的问题

    docker compose idea CreateProcess error=2 系统找不到指定的文件的问题

    这篇文章主要介绍了docker compose idea CreateProcess error=2 系统找不到指定的文件的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 关于Docker的基础概念分享

    关于Docker的基础概念分享

    Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于 Google公司推出的Go语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub上进行维护。
    2017-01-01
  • dockerfile健康检查HEALTHCHECK的命令学习

    dockerfile健康检查HEALTHCHECK的命令学习

    HEALTHCHECK 指令告诉 Docker 如何测试一个容器,以检查它是否仍在工作,本文主要介绍了dockerfile健康检查HEALTHCHECK的命令学习,感兴趣的可以了解一下
    2024-01-01
  • 欧拉系统部署Docker最佳实践指南

    欧拉系统部署Docker最佳实践指南

    本文给大家介绍欧拉系统部署Docker最佳实践指南,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • Docker给容器添加新端口映射两种方法及常用命令

    Docker给容器添加新端口映射两种方法及常用命令

    在使用Docker时容器的端口映射是一个核心概念,它允许容器与宿主机以及外部网络进行通信,这篇文章主要给大家介绍了关于Docker给容器添加新端口映射两种方法及常用命令的相关资料,需要的朋友可以参考下
    2024-07-07
  • Docker+Nginx单副本零停机发布实现并解决文件访问 404

    Docker+Nginx单副本零停机发布实现并解决文件访问 404

    本文提供了解决Docker容器文件隔离问题的方法,核心是Nginx和业务容器挂载相同的宿主机文件目录,通过Nginx重写规则去掉/api前缀匹配业务服务路径,同时发布时流量同步切换到临时副本,避免404和中断问题
    2026-04-04
  • Docker Machine创建Azure虚拟主机

    Docker Machine创建Azure虚拟主机

    这篇文章主要为大家详细介绍了Docker Machine创建Azure虚拟主机的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Docker拉取部署OpenJDK的完整指南

    Docker拉取部署OpenJDK的完整指南

    OpenJDK 作为 Java SE 的开源实现,是企业级 Java 应用的核心运行环境,而 Docker 的容器化部署能有效解决环境一致性、资源隔离等问题,本文将详细介绍 Docker 环境搭建、OpenJDK 拉取部署步骤,需要的朋友可以参考下
    2026-01-01
  • Docker容器如何配置权限

    Docker容器如何配置权限

    本文介绍了在Docker容器中配置用户和权限的方法,包括在Dockerfile中设置用户和权限,使用dockerrun命令设置用户和权限,以及在DockerCompose文件中设置用户和权限,通过这些方法,可以解决容器内部权限不足的问题
    2024-11-11
  • docker compose方式如何安装ClickHouse数据库

    docker compose方式如何安装ClickHouse数据库

    这篇文章主要介绍了docker compose方式如何安装ClickHouse数据库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论