docker 磁盘清理 相关

2023-10-30 23:50
文章标签 docker 相关 磁盘清理

本文主要是介绍docker 磁盘清理 相关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

典型问题场景

用户发现 Docker 宿主机的磁盘空间使用率非常高。通过 du 逐层分析,发现是 Volume 或 overlay2 等目录占用了过高空间。示例如下:

  1. # 根据使用的存储驱动的不同,相应目录会有所不同:
  2. [root@node3 docker] # du -h --max-depth=1 |sort
  3. 104K ./network
  4. 13M ./image
  5. 20K ./plugins
  6. 24G ./overlay2 # 这个目录占用了非常高的磁盘磁盘空间
  7. 25G .
  8. 283M ./volumes
  9. 4.0K ./swarm
  10. 4.0K ./tmp
  11. 4.0K ./trust
  12. 518M ./containers

空间使用分析

遇到此类问题,可以参阅如下步骤进行空间分析,定位占用过高空间的业务来源。

分析 Docker 空间分布

Docker 的内置 CLI 指令 docker system df ,可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使用大户的空间占用情况。 示例输出如下:

  1. [root@node3 docker]# docker system df
  2. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
  3. Images 17 12 2.713 GB 1.144 GB (42%)
  4. Containers 15 12 10.75 GB 0 B (0%)
  5. Local Volumes 8 4 282.9 MB 241.8 MB (85%)

查看空间占用细节

可以进一步通过 -v 参数查看空间占用细节,以确定具体是哪个镜像、容器或本地卷占用了过高空间。示例输出如下:

  1. [root@node3 docker]# docker system df -v
  2. # 镜像的空间使用情况
  3. Images space usage:
  4. REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
  5. busybox latest 6ad733544a63 5 days ago 1.129 MB 0 B 1.129 MB 1
  6. nginx latest b8efb18f159b 3 months ago 107.5 MB 107.5 MB 0 B 4
  7. ubuntu latest 14f60031763d 3 months ago 119.5 MB 0 B 119.5 MB 0
  8. alpine 3.3 606fed0878ec 4 months ago 4.809 MB 0 B 4.809 MB 0
  9. tutum/curl latest 01176385d84a 3 years ago 224.4 MB 0 B 224.4 MB 1
  10. # 容器的空间使用情况
  11. Containers space usage:
  12. CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
  13. d1da451ceeab busybox "ping 127.0.0.1" 0 10.7 GB About an hour ago Up About an hour dstest
  14. 956ae1d241e8 nginx:latest "nginx -g 'daemon ..." 0 26 B 3 months ago Up 3 months localTest_restserver_2
  15. 74973d237a06 nginx:latest "nginx -g 'daemon ..." 0 2 B 3 months ago Up 3 months
  16. # 本地卷的空间使用情况
  17. Local Volumes space usage:
  18. VOLUME NAME LINKS SIZE
  19. 83ba8747f4172a3c02a15f85b71e1565affca59f01352b4a94e0d28e65c26d1c 0 830 B
  20. a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648 0 22.16 MB
  21. 79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503 1 18.83 MB

空间清理

自动清理

可以通过 Docker 内置的 CLI 指令 docker system prune 来进行自动空间清理。

Tips :

不同状态的镜像

  • 已使用镜像(used image): 指所有已被容器(包括已停止的)关联的镜像。即 docker ps -a 看到的所有容器使用的镜像。
  • 未引用镜像(unreferenced image):没有被分配或使用在容器中的镜像,但它有 Tag 信息。
  • 悬空镜像(dangling image):未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。比如:
  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. < none> <none> 6ad733544a63 5 days ago 1.13 MB # 悬空镜像(dangling image)

挂起的卷(dangling Volume)
类似的,dangling=true 的 Volume 表示没有被任何容器引用的卷。

docker system prune 自动清理说明:

  • 该指令默认会清除所有如下资源:

    • 已停止的容器(container)
    • 未被任何容器所使用的卷(volume)
    • 未被任何容器所关联的网络(network)
    • 所有悬空镜像(image)。
  • 该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
  • 添加 -a 或 --all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
  • 可以添加 -f 或 --force 参数用以忽略相关告警确认信息。
  • 指令结尾处会显示总计清理释放的空间大小。

操作示例:

  1. [root@node3 docker] # docker system prune --help
  2. Usage: docker system prune [OPTIONS]
  3. Remove unused data
  4. Options:
  5. -a, --all Remove all unused images not just dangling ones
  6. -f, --force Do not prompt for confirmation
  7. --help Print usage
  8. [root@node3 docker] # docker system prune -a
  9. WARNING! This will remove:
  10. - all stopped containers
  11. - all volumes not used by at least one container
  12. - all networks not used by at least one container
  13. - all images without at least one container associated to them
  14. Are you sure you want to continue? [y/N] y
  15. Deleted Containers:
  16. c09c31c49491ee7f2324160e43947917940221b4e6cc1274906def640a7a631f
  17. 2aa0180e1a0f4c2c64349a6ed969651052373e7a9471050dce9015701cf1b957
  18. 6d18003b06823c5d76d807a319387b06680fc93d0a32bc29c1cea4c07e8d515d
  19. Deleted Volumes:
  20. a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648
  21. 79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503
  22. Deleted Images:
  23. untagged: tutum/curl:latest
  24. untagged: tutum/curl@sha256:b6f16e88387acd4e6326176b212b3dae63f5b2134e69560d0b0673cfb0fb976f
  25. deleted: sha256: 01176385d84aeb1d40ed18c6d3f952abf40d2d2b4aa98fcf0a8a4b01010fb9a9
  26. deleted: sha256:c84f85637212412c1d46d1dd50f789df2c3b44678ee3fee6a820888e734f9b5a
  27. untagged: test:lastest
  28. deleted: sha256: 794ff09332586a091514eb3d1c44990244e57e34adc71d4b4334c0674a1377e9
  29. deleted: sha256: 636a1e7769d2242556243e9a21fb96bb878ab5b94c41ff485667252c968b375e
  30. Total reclaimed space: 1.565 GB

手工清理

网络清理

网络配置通常占用的空间非常低,略过。

镜像清理

如果通过 docker system df 分析,是镜像占用了过高空间。则可以根据业务情况,评估相关镜像的使用情况。对于悬空和未使用的镜像, 可以使用如下指令手工清理:

  1. # 删除所有悬空镜像,但不会删除未使用镜像:
  2. docker rmi $(docker images -f "dangling=true" -q)
  3. # 删除所有未使用镜像和悬空镜像。
  4. # 【说明】:轮询到还在被使用的镜像时,会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可。
  5. docker rmi $(docker images-q)

卷清理

如果通过 docker system df 分析,是卷占用了过高空间。则可以根据业务情况,评估相关卷的使用情况。对于未被任何容器调用的卷(-v 结果信息中,"LINKS" 显示为 0),可以使用如下指令手工清理:

  1. # 删除所有未被任何容器关联引用的卷:
  2. docker volume rm $(docker volume ls -qf dangling= true)
  3. # 也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
  4. # 【说明】轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可。
  5. docker volume rm $(docker volume ls -q)

容器清理

如果通过 docker system df 分析,是某个容器占用了过高空间。则可以根据业务情况,评估相关容器的业务归属并进行处理。对于已停止或其它异常状态的容器,可以结合  -f 或 --filter 筛选器,使用类似如下指令来手工清理:

  1. # 删除所有已退出的容器
  2. docker rm -v $(docker ps -aq -f status=exited)
  3. # 删除所有状态为 dead 的容器
  4. docker rm -v $(docker ps -aq -f status=dead)

更多关于 ps 指令支持的筛选器信息,可以参阅官方文档。

在用空间资源分析

对于还在使用的空间资源,可以参阅如下说明做进一步排查分析。

镜像空间分析

如果某个镜像占用了过高空间,则可以通过如下方式做进一步空间分析:

  1. 通过 docker system df 获取占用过高空间的镜像信息。
  2. 基于相应镜像创建测试容器。
  3. exec 进入容器后,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
  4. 结合业务情况做进一步处理,重新 build 镜像。

示例:

  1. [root@node3] # docker exec -it dstest sh
  2. / # du -h | head
  3. 8.0K ./root
  4. 32.0K ./etc
  5. 4.0K ./usr/sbin
  6. 8.0K ./usr
  7. 10.0G ./home/java/logs
  8. 10.0G ./home/java
  9. 10.0G ./home
  10. 1.1M ./bin
  11. 0 ./dev/shm
  12. 0 ./dev/mqueue

容器空间分析

如果某个运行中的容器占用了过高空间,则可以通过如下方式做进一步空间分析:

Tips :

容器的只读层与镜像层的空间占用情况
一个容器的占用的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅官方文档。
可以通过 docker ps 的 -s 参数来分别显示二者的空间占用情况,进而判断相应容器的空间占用主要是来自原始镜像,还是运行中产生。

容器空间占用示意图
示例:

  1. # 如下容器的原始镜像占用了 422MB 空间,实际运行过程中只占用了 2B 空间:
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
  3. ac39128ccbc0 registry.aliyuncs.com/acs-sample/wordpress: 4.6 "/entrypoint.sh ap..." 3 months ago Up 11 days 0.0.0.0:32779->80/tcp Web_web_4 2 B (virtual 422 MB)

容器空间占用的分析步骤:

    1. 通过 docker system df 获取占用过高空间的容器信息。
    2. 通过前述 -s 参数确认到底是底层镜像,还是运行过程中产生的数据占用了过高空间。
    3. exec 进入容器,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
    4. 结合业务情况做进一步处理。

转载于:https://www.cnblogs.com/whm-blog/p/10726954.html

这篇关于docker 磁盘清理 相关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311375

相关文章

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p