Docker空间使用分析与清理

Docker空间使用分析与清理

2023年7月6日发(作者:)

Docker空间使⽤分析与清理⽤户在使⽤ Docker 部署业务⼀段时间后,可能会发现宿主节点的磁盘容量持续增长,甚⾄将磁盘空间耗尽进⽽引发宿主机异常,进⽽对业务造成影响。 本⽂先对 Docker 的空间分析与清理进⾏说明,然后对容器的磁盘容量限制与使⽤建议做简要说明。典型问题场景⽤户发现 Docker 宿主机的磁盘空间使⽤率⾮常⾼。通过 du 逐层分析,发现是 Volume 或 overlay2 等⽬录占⽤了过⾼空间。⽰例如下:# 根据使⽤的存储驱动的不同,相应⽬录会有所不同:[root@node3 docker]# du -h --max-depth=1 |sort104K ./network13M ./image20K ./plugins24G ./overlay2 # 这个⽬录占⽤了⾮常⾼的磁盘磁盘空间25G .283M ./volumes4.0K ./swarm4.0K ./tmp4.0K ./trust518M ./containers空间使⽤分析遇到此类问题,可以参阅如下步骤进⾏空间分析,定位占⽤过⾼空间的业务来源。分析 Docker 空间分布Docker 的内置 CLI 指令 docker system df ,可⽤于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使⽤⼤户的空间占⽤情况。 ⽰例输出如下:[root@node3 docker]# docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 17 12 2.713 GB 1.144 GB (42%)Containers 15 12 10.75 GB 0 B (0%)Local Volumes 8 4 282.9 MB 241.8 MB (85%)查看空间占⽤细节可以进⼀步通过 -v 参数查看空间占⽤细节,以确定具体是哪个镜像、容器或本地卷占⽤了过⾼空间。⽰例输出如下:[root@node3 docker]# docker system df -v# 镜像的空间使⽤情况Images space usage:REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAbusybox latest 6ad733544a63 5 days ago 1.129 MB 0 B 1.129 MB 1nginx latest b8efb18f159b 3 months ago 107.5 MB 107.5 MB 0 B 4ubuntu latest 14f60031763d 3 months ago 119.5 MB 0 B 119.5 MB 0alpine 3.3 606fed0878ec 4 months ago 4.809 MB 0 B 4.809 MB 0tutum/curl latest 01176385d84a 3 years ago 224.4 MB 0 B 224.4 MB 1# 容器的空间使⽤情况Containers space usage:CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS

d1da451ceeab busybox "ping 127.0.0.1" 0 10.7 GB About an hour ago Up About an hour

956ae1d241e8 nginx:latest "nginx -g 'daemon ..." 0 26 B 3 months ago Up 3 months

74973d237a06 nginx:latest "nginx -g 'daemon ..." 0 2 B 3 months ago Up 3 months

# 本地卷的空间使⽤情况Local Volumes space usage:VOLUME NAME LINKS SIZE83ba8747f4172a3c02a15f85b71e1565affca59f01352b4a94e0d28e65c26d1c 0 830 Ba479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648 0 22.16 MB79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503 1 18.83 MB空间清理⾃动清理可以通过 Docker 内置的 CLI 指令 docker system prune 来进⾏⾃动空间清理。Tips :不同状态的镜像已使⽤镜像(used image): 指所有已被容器(包括已停⽌的)关联的镜像。即 docker ps -a 看到的所有容器使⽤的镜像。未引⽤镜像(unreferenced image):没有被分配或使⽤在容器中的镜像,但它有 Tag 信息。悬空镜像(dangling image):未配置任何 Tag (也就⽆法被引⽤)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。⽐如:REPOSITORY TAG IMAGE ID CREATED SIZE 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 参数⽤以忽略相关告警确认信息。指令结尾处会显⽰总计清理释放的空间⼤⼩。操作⽰例:[root@node3 docker]# docker system prune --helpUsage: docker system prune [OPTIONS]Remove unused dataOptions: -a, --all Remove all unused images not just dangling ones -f, --force Do not prompt for confirmation --help Print usage[root@node3 docker]# docker system prune -aWARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all networks not used by at least one container - all images without at least one container associated to themAre you sure you want to continue? [y/N] yDeleted Containers:c09c31c49491ee7f2324160e43947917940221b4e6cc1274906def640a7a631f2aa0180e1a0f4c2c64349a6ed969651052373e7a9471050dce9015701cf1b9576d18003b06823c5d76d807a319387b06680fc93d0a32bc29c1cea4c07e8d515dDeleted Volumes:a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b64879a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503Deleted Images:untagged: tutum/curl:latestuntagged: tutum/curl@sha256:b6f16e88387acd4e6326176b212b3dae63f5b2134e69560d0b0673cfb0fb976fdeleted: sha256:01176385d84aeb1d40ed18c6d3f952abf40d2d2b4aa98fcf0a8a4b01010fb9a9deleted: sha256:c84f85637212412c1d46d1dd50f789df2c3b44678ee3fee6a820888e734f9b5auntagged: test:lastestdeleted: sha256:794ff09332586a091514eb3d1c44990244e57e34adc71d4b4334c0674a1377e9deleted: sha256:636a1e7769d2242556243e9a21fb96bb878ab5b94c41ff485667252c968b375eTotal reclaimed space: 1.565 GB⼿⼯清理⽹络清理⽹络配置通常占⽤的空间⾮常低,略过。镜像清理如果通过 docker system df 分析,是镜像占⽤了过⾼空间。则可以根据业务情况,评估相关镜像的使⽤情况。对于悬空和未使⽤的镜像,可以使⽤如下指令⼿⼯清理:# 删除所有悬空镜像,但不会删除未使⽤镜像:docker rmi $(docker images -f "dangling=true" -q)# 删除所有未使⽤镜像和悬空镜像。# 【说明】:轮询到还在被使⽤的镜像时,会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可。docker rmi $(docker images-q)卷清理如果通过 docker system df 分析,是卷占⽤了过⾼空间。则可以根据业务情况,评估相关卷的使⽤情况。对于未被任何容器调⽤的卷(-v结果信息中,"LINKS" 显⽰为 0),可以使⽤如下指令⼿⼯清理:# 删除所有未被任何容器关联引⽤的卷:docker volume rm $(docker volume ls -qf dangling=true)# 也可以直接使⽤如下指令,删除所有未被任何容器关联引⽤的卷(但建议使⽤上⾯的⽅式)# 【说明】轮询到还在使⽤的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可。docker volume rm $(docker volume ls -q)容器清理如果通过 docker system df 分析,是某个容器占⽤了过⾼空间。则可以根据业务情况,评估相关容器的业务归属并进⾏处理。对于已停⽌或其它异常状态的容器,可以结合 -f 或 --filter 筛选器,使⽤类似如下指令来⼿⼯清理:# 删除所有已退出的容器docker rm -v $(docker ps -aq -f status=exited)# 删除所有状态为 dead 的容器docker rm -v $(docker ps -aq -f status=dead)更多关于 ps 指令⽀持的筛选器信息,可以参阅。在⽤空间资源分析对于还在使⽤的空间资源,可以参阅如下说明做进⼀步排查分析。镜像空间分析如果某个镜像占⽤了过⾼空间,则可以通过如下⽅式做进⼀步空间分析:1. 通过 docker system df 获取占⽤过⾼空间的镜像信息。2. 基于相应镜像创建测试容器。3. exec 进⼊容器后,结合 du 等 shell 指令做进⼀步空间分析,定位出占⽤最⾼空间的⽬录或⽂件。4. 结合业务情况做进⼀步处理,重新 build 镜像。⽰例:[root@node3]# docker exec -it dstest sh/ # du -h | head8.0K ./root32.0K ./etc4.0K ./usr/sbin8.0K ./usr10.0G ./home/java/logs10.0G ./home/java10.0G ./home1.1M ./bin0 ./dev/shm0 ./dev/mqueue容器空间分析如果某个运⾏中的容器占⽤了过⾼空间,则可以通过如下⽅式做进⼀步空间分析:Tips :容器的只读层与镜像层的空间占⽤情况⼀个容器的占⽤的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅。可以通过 docker ps 的 -s 参数来分别显⽰⼆者的空间占⽤情况,进⽽判断相应容器的空间占⽤主要是来⾃原始镜像,还是运⾏中产⽣。⽰例:# 如下容器的原始镜像占⽤了 422MB 空间,实际运⾏过程中只占⽤了 2B 空间:CONTAINER ID IMAGE COMMAND CREATED STATUS

ac39128ccbc0 /acs-sample/wordpress:4.6 "/ ap..." 3 months ago

容器空间占⽤的分析步骤:1. 通过 docker system df 获取占⽤过⾼空间的容器信息。2. 通过前述 -s 参数确认到底是底层镜像,还是运⾏过程中产⽣的数据占⽤了过⾼空间。3. exec 进⼊容器,结合 du 等 shell 指令做进⼀步空间分析,定位出占⽤最⾼空间的⽬录或⽂件。4. 结合业务情况做进⼀步处理。引申:Docker 磁盘空间限制与使⽤建议磁盘空间限制使⽤ Device Mapper 存储驱动限制容器磁盘空间如果使⽤ Device Mapper 作为底层存储驱动,则可以通过 Docker daemon 的如下参数来全局限制单个容器占⽤空间的⼤⼩:--storage-opt ze=20G 表⽰限制单个容器最多占⽤ 20G 空间,将应⽤于任何新建容器。更多关于 Device Mapper 存储驱动的说明,可以参阅。使⽤ btrfs 存储驱动限制容器磁盘空间btrfs 驱动主要使⽤ btrfs 所提供的 subvolume 功能来实现。⼀个容器会对应⼀个 subvolume。针对容器对应的 subvolume 启⽤并配置 quota 即可限制其磁盘空间。⽰例配置:btrfs qgroup limit -e 50G /var/lib/docker/btrfs/subvolumes/btrfs 还有其它很好的特性,⽐如可以在线扩容(在线加⼊⼀块新的块设备,来扩充整个⽂件系统的⼤⼩)。更多关于 btrfs 存储驱动的说明,可以参阅。外挂 LVM 卷如果使⽤的是其它不⽀持对单个容器的磁盘容量进⾏限制的存储驱动,则可以考虑如下通⽤⽅案:通过 LVM ⽅式创建⼀个指定容量的卷,然后挂载到宿主操作系统上特定⽬录。最后通过 --volume 参数来让容器来挂载使⽤相应⽬录。注意:该⽅案的前提条件是,容器中所有落盘操作要全部落到上述 "--volume" 参数指定的卷中,否则容器还会占⽤默认 aufs 所在盘的空间,进⽽造成统计不准。Docker 存储使⽤建议细化的存储使⽤最佳实践与采⽤的存储驱动(storage driver)类型强相关,您可以参阅做相关了解,本⽂不做进⼀步细化说明。通⽤的存储使⽤建议如下:容器内的业务⽇志务必配置轮询覆写,或者使⽤⽇志驱动将⽇志输出到外部存储。避免⽇志⽂件持续增长,占⽤过⾼磁盘空间。结合外部监控对宿主机的磁盘空间使⽤情况进⾏监控和告警。可以参阅⽂档 来扩容默认 Docker 存储空间。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688593569a153176.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信