docker容器资源监控脚本可用shell+docker cli实现:定期调用docker stats --no-stream --format输出cpu、内存、网络和磁盘i/o,支持json解析与日志轮转,注意权限、空容器过滤及编码问题。

写一个 Docker 容器资源监控脚本,核心是定期采集容器的 CPU、内存、网络和磁盘 I/O 使用情况,并输出可读结果或存入日志。不需要复杂框架,用 shell + Docker CLI 就能快速实现。
基础监控:用 docker stats 实时抓取
docker stats 是最轻量的方式,它直接返回每个运行中容器的实时资源使用率(CPU%、内存使用/限制、网络收发、块 I/O)。适合简单轮询:
- 加
--no-stream参数只获取单次快照,避免阻塞 - 加
--format自定义输出字段,比如:docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" - 配合
watch -n 2可实现每 2 秒刷新一次(仅用于调试)
结构化采集:解析 JSON 输出便于后续处理
如果需要进一步分析或写入数据库/告警系统,建议用 docker stats --format '{{json .}}' 输出 JSON:
- 每行一个 JSON 对象,字段包括 Name、CPUPerc、MemUsage、MemPerc、NetIO、BlockIO 等
- 可用
jq提取关键字段,例如:docker stats --no-stream --format '{{json .}}' | jq -r '.Name, .CPUPerc, .MemPerc' - 注意 MemUsage 是 “XMiB / YMiB” 格式,需用
awk或jq拆分提取数值
轻量日志记录:定时保存到文件并自动轮转
用 crontab + shell 脚本 每分钟记录一次,避免内存暴涨:
- 脚本开头加时间戳:
echo "$(date '+%Y-%m-%d %H:%M:%S') $(docker stats ...)" > /var/log/docker-mon.log - 用
logrotate管理日志大小,或脚本内判断文件超限后重命名归档 - 建议只记录关键字段(容器名、CPU%、内存%、网络收发字节数),减少 IO 压力
进阶提示:避开常见坑
实际部署时容易忽略的细节:
-
权限问题:脚本若由非 root 用户运行,需将用户加入
docker组,否则无法调用 docker CLI - 容器启动延迟:刚启动的容器可能在 stats 中短暂显示为 0%,建议跳过状态为 “running” 但 stats 数据为空的容器
-
空容器干扰:用
docker ps -q过滤出真正运行中的容器 ID,再传给 stats,避免统计已退出容器 -
中文字符乱码:确保脚本文件编码为 UTF-8,终端 locale 设置正确(如
LANG=en_US.UTF-8)











