内容简介:摘要:用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响。 本文先对 Docker 的空间分析与清理进行说明,然后对容器的磁盘容量限制与使用建议做简要说明。用户发现 Docker 宿主机的磁盘空间使用率非常高。通过 du 逐层分析,发现是
摘要:用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响。 本文先对 Docker 的空间分析与清理进行说明,然后对容器的磁盘容量限制与使用建议做简要说明。
典型问题场景
用户发现 Docker 宿主机的磁盘空间使用率非常高。通过 du 逐层分析,发现是 Volume 或 overlay2 等目录占用了过高空间。示例如下:
空间使用分析
遇到此类问题,可以参阅如下步骤进行空间分析,定位占用过高空间的业务来源。
分析 Docker 空间分布
Docker 的内置 CLI 指令 dockersystemdf ,可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使用大户的空间占用情况。 示例输出如下:
查看空间占用细节
可以进一步通过 - v 参数查看空间占用细节,以确定具体是哪个镜像、容器或本地卷占用了过高空间。示例输出如下:
空间清理
自动清理
可以通过 Docker 内置的 CLI 指令 dockersystemprune 来进行自动空间清理。
Tips :
不同状态的镜像
已使用镜像(used image) : 指所有已被容器(包括已停止的)关联的镜像。即 dockerps - a 看到的所有容器使用的镜像。
未引用镜像(unreferenced image) :没有被分配或使用在容器中的镜像,但它有 Tag 信息。
悬空镜像(dangling image) :未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。比如:
挂起的卷(dangling Volume)
类似的, dangling = true 的 Volume 表示没有被任何容器引用的卷。
dockersystemprune 自动清理说明:
该指令默认会清除所有如下资源:
已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所关联的网络(network)
所有悬空镜像(image)。
该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
添加 - a 或 -- all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
可以添加 - f 或 -- force 参数用以忽略相关告警确认信息。
指令结尾处会显示总计清理释放的空间大小。
操作示例:
手工清理
网络清理
网络配置通常占用的空间非常低,略过。
镜像清理
如果通过 dockersystemdf 分析,是镜像占用了过高空间。则可以根据业务情况,评估相关镜像的使用情况。对于悬空和未使用的镜像, 可以使用如下指令手工清理:
容器清理
如果通过 dockersystemdf 分析,是某个容器占用了过高空间。则可以根据业务情况,评估相关容器的业务归属并进行处理。对于已停止或其它异常状态的容器,可以结合-f 或 --filter筛选器,使用类似如下指令来手工清理:
在用空间资源分析
对于还在使用的空间资源,可以参阅如下说明做进一步排查分析。
镜像空间分析
如果某个镜像占用了过高空间,则可以通过如下方式做进一步空间分析:
通过 dockersystemdf 获取占用过高空间的镜像信息。
基于相应镜像创建测试容器。
exec 进入容器后,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
结合业务情况做进一步处理,重新 build 镜像。
示例:
容器空间分析
如果某个运行中的容器占用了过高空间,则可以通过如下方式做进一步空间分析:
Tips :
容器的只读层与镜像层的空间占用情况
一个容器的占用的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅 官方文档 。
可以通过 docker ps 的-s参数来分别显示二者的空间占用情况,进而判断相应容器的空间占用主要是来自原始镜像,还是运行中产生。
容器空间占用的分析步骤:
通过 dockersystemdf 获取占用过高空间的容器信息。
通过前述-s参数确认到底是底层镜像,还是运行过程中产生的数据占用了过高空间。
exec 进入容器,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
结合业务情况做进一步处理。
引申:Docker 磁盘空间限制与使用建议
磁盘空间限制
使用 Device Mapper 存储驱动限制容器磁盘空间
如果使用 Device Mapper 作为底层存储驱动,则可以通过 Docker daemon 的如下参数来全局限制单个容器占用空间的大小:
--storage-opt dm.basesize=20G表示限制单个容器最多占用 20G 空间,将应用于任何新建容器。
更多关于 Device Mapper 存储驱动的说明,可以参阅 官方文档 。
使用 btrfs 存储驱动限制容器磁盘空间
btrfs 驱动主要使用 btrfs 所提供的 subvolume 功能来实现。一个容器会对应一个 subvolume。针对容器对应的 subvolume 启用并配置 quota 即可限制其磁盘空间。示例配置:btrfs 还有其它很好的特性,比如可以在线扩容(在线加入一块新的块设备,来扩充整个文件系统的大小)。
外挂 LVM 卷
如果使用的是其它不支持对单个容器的磁盘容量进行限制的存储驱动,则可以考虑如下通用方案:
通过 LVM 方式创建一个指定容量的卷,然后挂载到宿主操作系统上特定目录。最后通过 --volume 参数来让容器来挂载使用相应目录。
注意 :该方案的前提条件是,容器中所有落盘操作要全部落到上述 "--volume" 参数指定的卷中,否则容器还会占用默认 aufs 所在盘的空间,进而造成统计不准。
Docker 存储使用建议
细化的存储使用最佳实践与采用的存储驱动(storage driver)类型强相关
通用的存储使用建议如下:
容器内的业务日志务必配置轮询覆写,或者使用日志驱动将日志输出到外部存储。避免日志文件持续增长,占用过高磁盘空间。
结合外部监控对宿主机的磁盘空间使用情况进行监控和告警。
参考连接:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
基于内容图像检索技术
周明全 / 清华大学 / 2007-12 / 28.00元
《基于内容图像检索技术》从理论方法研究与实现技术角度,总结归纳了基于内容图像检索(CBIR)技术的研究与进展,并融入了作者多年来的相关研究与应用成果,系统地介绍了CBIR的主要概念、基本原理、典型方法、实用范例以及新动向。《基于内容图像检索技术》共有12章分为五部分:第一部分是概述,分析了CBIR的体系结构、技术现状和发展趋势;第一部分讨论图像特征提取,给出图像低层特征(颜色、形状、纹理、空间关系......一起来看看 《基于内容图像检索技术》 这本书的介绍吧!