docker stats 资源使用
面试题
如何实时监控 Docker 容器的 CPU、内存、网络 I/O 等资源使用情况?
标准答案
docker stats 是一个类似 Linux top 的实时资源监控命令,可以查看运行中容器的 CPU、内存、网络、磁盘 I/O 等使用情况。
基本用法
# 查看所有运行中容器的资源使用
docker stats
# 查看指定容器
docker stats my-container
# 查看多个容器
docker stats container1 container2
# 只输出一次(不持续刷新)
docker stats --no-stream
# 格式化输出
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
输出字段说明
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a1b2c3d4e5f6 web 0.25% 45.6MiB / 512MiB 8.91% 12.3kB / 8.2kB 0B / 0B 8
| 字段 | 含义 | 说明 |
|---|---|---|
| CPU % | CPU 使用率百分比 | 相对宿主机总 CPU |
| MEM USAGE | 当前内存使用量 | RSS(常驻内存) |
| MEM % | 内存使用百分比 | 相对限制值 |
| NET I/O | 网络收发数据量 | 累计值 |
| BLOCK I/O | 块设备读写数据量 | 累计值 |
| PIDS | 进程/线程数 | 常用于排查内存泄漏 |
实战场景
1. 排查容器内存泄漏
# 持续观察内存增长趋势
docker stats --no-stream myapp | grep -E "NAME|myapp"
# 或配合 watch 定时监控
watch -n 5 'docker stats --no-stream myapp'
# 内存持续增长可能是泄漏
# 结合 docker inspect 看内存限制
docker inspect myapp | jq '.[0].HostConfig.Memory'
2. 检查容器是否达到资源限制
# 查看内存使用接近限制的容器
docker stats --no-stream --format \
"table {{.Name}}\t{{.MemPerc}}"
3. 输出到文件做后续分析
# 每隔 10 秒采集一次,持续 1 小时
for i in $(seq 1 360); do
docker stats --no-stream --format \
"{{.Name}},{{.CPUPerc}},{{.MemUsage}}" \
>> /var/log/container_stats.csv
sleep 10
done
常用格式模板
# 只显示关键信息
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
# JSON 格式输出(适合程序解析)
docker stats --no-stream --format "{{json .}}"
可用占位符:
| 占位符 | 说明 |
|---|---|
.Name |
容器名称 |
.Container |
容器 ID |
.CPUPerc |
CPU 百分比 |
.MemUsage |
内存使用量/限制 |
.MemPerc |
内存使用百分比 |
.NetIO |
网络 I/O |
.BlockIO |
块 I/O |
.PIDs |
进程数 |
与其他监控工具的关系
# docker stats 不等于宿主机 top 看到的进程
# 原因:容器共享宿主机内核,top 看到的是所有进程混杂在一起
# 在容器内看本容器的进程
docker exec myapp top
# 宿主机上过滤容器进程
ps aux | grep -E "docker|containerd|myapp"
限制与注意事项
1. 只能查看运行中容器
# 已停止容器的历史资源数据无法获取
# 如果需要历史数据,考虑 cAdvisor、Prometheus 等工具
2. 性能开销
# docker stats 本身有一定的性能开销
# 高频采集(< 1s)不建议在生产环境长时间运行
3. 精度问题
# CPU% 是相对值,不是绝对值
# 4 核机器上 100% CPU = 用满 1 个核,400% = 用满所有核
与 Docker API 集成
# 通过 API 获取 stats 数据
curl --unix-socket /var/run/docker.sock \
http://localhost/containers/myapp/stats?stream=false
# 返回 JSON 格式,包含 CPU 详情(cpu_usage、system_cpu_usage 等)
生产环境建议
# 1. 短时间排障用 docker stats
docker stats --no-stream myapp
# 2. 持续监控用外部工具
# Prometheus + cAdvisor + Grafana
# 3. 采集频率建议
# 排查时 5-10 秒一次
# 监控系统 15-60 秒一次
常见问题
Q:docker stats 显示的 MEM USAGE 为什么比 top 看到的少?
docker stats 统计的是 RSS(Resident Set Size),不含共享内存和缓存。而 top 看到的 RES 列可能有不同统计口径。
Q:如何查看某个容器历史资源使用峰值?
# docker stats 不保存历史数据
# 需要配置 Prometheus + cAdvisor 或使用 Docker 原生监控插件
Q:BLOCK I/O 一直是 0 怎么办?
某些存储驱动(如 overlay2)的块 I/O 统计可能不准确。网络 I/O 数据通常更可靠。
总结
docker stats是容器实时排障的第一选择- 核心记住:
--no-stream单次快照、格式化输出--format - 不适合长期监控,持续采集用 Prometheus + cAdvisor
- CPU% 是相对值,注意核数换算
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容