Docker 空间使用分析与清理

栏目: 编程工具 · 发布时间: 5年前

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

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

典型问题场景

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

Docker 空间使用分析与清理

空间使用分析

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

分析 Docker 空间分布

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

Docker 空间使用分析与清理

查看空间占用细节

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

Docker 空间使用分析与清理

空间清理

自动清理

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

Tips

不同状态的镜像

已使用镜像(used image) : 指所有已被容器(包括已停止的)关联的镜像。即 dockerps - a 看到的所有容器使用的镜像。

未引用镜像(unreferenced image) :没有被分配或使用在容器中的镜像,但它有 Tag 信息。

悬空镜像(dangling image) :未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。比如:

Docker 空间使用分析与清理

挂起的卷(dangling Volume)

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

dockersystemprune 自动清理说明:

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

已停止的容器(container)

未被任何容器所使用的卷(volume)

未被任何容器所关联的网络(network)

所有悬空镜像(image)。

该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。

添加 - a -- all 参数后,可以一并清除所有未使用的镜像和悬空镜像。

可以添加 - f -- force 参数用以忽略相关告警确认信息。

指令结尾处会显示总计清理释放的空间大小。

操作示例:

Docker 空间使用分析与清理

手工清理

网络清理

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

镜像清理

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

Docker 空间使用分析与清理

容器清理

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

Docker 空间使用分析与清理

在用空间资源分析

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

镜像空间分析

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

通过 dockersystemdf 获取占用过高空间的镜像信息。

基于相应镜像创建测试容器。

exec 进入容器后,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。

结合业务情况做进一步处理,重新 build 镜像。

示例:

Docker 空间使用分析与清理

容器空间分析

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

Tips

容器的只读层与镜像层的空间占用情况

一个容器的占用的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅 官方文档

可以通过 docker ps 的-s参数来分别显示二者的空间占用情况,进而判断相应容器的空间占用主要是来自原始镜像,还是运行中产生。

Docker 空间使用分析与清理

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

通过 dockersystemdf 获取占用过高空间的容器信息。

通过前述-s参数确认到底是底层镜像,还是运行过程中产生的数据占用了过高空间。

exec 进入容器,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。

结合业务情况做进一步处理。

引申:Docker 磁盘空间限制与使用建议

磁盘空间限制

使用 Device Mapper 存储驱动限制容器磁盘空间

如果使用 Device Mapper 作为底层存储驱动,则可以通过 Docker daemon 的如下参数来全局限制单个容器占用空间的大小:

--storage-opt dm.basesize=20G表示限制单个容器最多占用 20G 空间,将应用于任何新建容器。

更多关于 Device Mapper 存储驱动的说明,可以参阅 官方文档

使用 btrfs 存储驱动限制容器磁盘空间

Docker 空间使用分析与清理

btrfs 驱动主要使用 btrfs 所提供的 subvolume 功能来实现。一个容器会对应一个 subvolume。针对容器对应的 subvolume 启用并配置 quota 即可限制其磁盘空间。示例配置:btrfs 还有其它很好的特性,比如可以在线扩容(在线加入一块新的块设备,来扩充整个文件系统的大小)。

外挂 LVM 卷

如果使用的是其它不支持对单个容器的磁盘容量进行限制的存储驱动,则可以考虑如下通用方案:

通过 LVM 方式创建一个指定容量的卷,然后挂载到宿主操作系统上特定目录。最后通过 --volume 参数来让容器来挂载使用相应目录。

注意 :该方案的前提条件是,容器中所有落盘操作要全部落到上述 "--volume" 参数指定的卷中,否则容器还会占用默认 aufs 所在盘的空间,进而造成统计不准。

Docker 存储使用建议

细化的存储使用最佳实践与采用的存储驱动(storage driver)类型强相关

通用的存储使用建议如下:

容器内的业务日志务必配置轮询覆写,或者使用日志驱动将日志输出到外部存储。避免日志文件持续增长,占用过高磁盘空间。

结合外部监控对宿主机的磁盘空间使用情况进行监控和告警。

参考连接:

https://www.jianshu.com/p/54e7bcc9f147


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Computers and Intractability

Computers and Intractability

M R Garey、D S Johnson / W. H. Freeman / 1979-4-26 / GBP 53.99

This book's introduction features a humorous story of a man with a line of people behind him, who explains to his boss, "I can't find an efficient algorithm, but neither can all these famous people." ......一起来看看 《Computers and Intractability》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具