docker stats 资源使用

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
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容