docker stats 是什么
docker stats 展示容器的资源占用:处理器、内存、网络与磁盘读写。默认是流式刷新,数字每秒更新一次,适合盯着看谁在吃资源;加单次采样的选项后只输出一份快照,方便贴进工单或喂给监控脚本。
基本信息
| 语法 | docker stats [选项] [CONTAINER...] |
|---|---|
| 常用选项 | --no-stream 只取一次 --all 含已停止容器 --format 自定义输出 |
| 权限要求 | 能访问 Docker 守护进程即可 |
| 数据来源 | 读取容器的资源组统计,宿主内核不支持时部分指标会缺失 |
| 平台差异 | Linux 主机数据完整;桌面环境跑在虚拟机里,与宿主任务管理器数字不对应 |
典型使用场景
- 定位热点容器:机器变慢时快速找出占用最高的那个实例
- 容量规划:观察服务的正常水位与峰值,据此设定内存上限
- 验证限制是否生效:确认容器是否真的用上了配置的处理器与内存配额
- 发布后观察:新版本上线后对照资源曲线,判断是否引入性能回退
- 采集快照:定时取单次数值写入监控系统,形成长期趋势
常用示例
常用示例
docker stats # 全量流式刷新
docker stats --no-stream # 只输出一次快照
docker stats --no-stream web db # 只看指定容器
docker stats --all --no-stream # 含已停止的容器
docker stats --format 'table {{.Name}} {{.CPUPerc}} {{.MemUsage}}' --no-stream输出逐列读法
| 列 | 含义 | 常见读法 |
|---|---|---|
| 容器标识 | 容器 ID 与名称 | 只显示 ID 说明容器没起名字,脚本取值先归一 |
| 处理器占用 | 占用的处理器百分比,按单核归一 | 多核机器上超过一百属于正常,接近核数总量说明已跑满 |
| 内存用量与上限 | 已用内存与限制值 | 没设上限时上限显示宿主总内存,这类容器会把整机拖下水 |
| 内存占比 | 已用内存占限制值的比例 | 长期贴近上限要考虑调大或排查泄漏 |
| 网络流量 | 累计接收与发送流量 | 持续单向增长可能是在被刷或被灌数据 |
| 磁盘读写 | 累计磁盘读写量 | 读写量异常高时先看是否有大量日志落盘 |
| 进程数 | 容器内进程与线程数 | 数量持续上涨往往意味着子进程没被回收 |
看到异常之后怎么查
- 处理器高:先进容器看进程排序,确认是应用本身还是被压测流量打满
- 内存高:确认上限设置是否合理,再看应用内部的对象增长与缓存策略
- 网络异常:对照连接列表与请求日志,判断是外部流量还是内部重试风暴
- 磁盘突增:检查日志输出量与临时文件,必要时加日志轮转
- 与宿主工具对不上:先确认两边是不是同一个内核视角,桌面环境差异属正常
瞬时采样容易错过尖峰。需要可靠结论时用单次模式定时采集,或接入监控系统做长周期统计,别凭一眼的数字下结论。
内存列的上限来自容器的内存限制配置,未配置时就等于宿主内存;想让数字有意义,生产容器应显式声明内存上限。
读数与设限的配合
- 先观察再设限:拿正常业务水位与高峰数值作为依据,拍脑袋设的数字要么误杀要么形同虚设
- 设了内存上限就要接受超限被杀的结果,配套做法是提高上限或修复泄漏
- 处理器配额与实时占用是两回事,配额决定上限,实时数字反映当前压力
- 容器数量多时逐台观察没有意义,统一接入监控再按异常告警排查
- 对比同一服务不同版本的数字,能更早发现性能回退与配置漂移