使用 docker stats 监控容器 cpu 峰值,最直接的方法是利用其内置的 --no-stream 参数进行单次采样,或者结合 linux 原生的 top 命令在容器内部获取历史最高值。由于 docker stats 默认是持续刷新输出的流式数据,无法直接通过单一命令抓取“过去一小时”的峰值,因此需要借助外部脚本或系统工具来记录并分析这些数据。

如何通过脚本捕获 docker stats 的瞬时峰值
要获取容器在一段时间内的 CPU 峰值,可以编写一个简单的 Shell 循环,定期调用 docker stats --no-stream 并将结果追加到日志文件中,最后通过解析日志找出最大值。这种方法适用于任何支持 Docker 的环境,且不需要修改容器内部的配置。

#!/bin/bash
CONTAINER_ID="my_container"
DURATION=60 # 监控时长(秒)
INTERVAL=5 # 采样间隔(秒)
LOG_FILE="/tmp/cpu_stats.log"
# 清空旧日志
> $LOG_FILE
END_TIME=$((SECONDS + DURATION))
while [ $SECONDS -lt $END_TIME ]; do
# 获取当前 CPU 百分比,提取数值部分
CPU_USAGE=$(docker stats --no-stream $CONTAINER_ID \
--format "{{.CPUPerc}}" | grep -o '[0-9.]*')
echo "$CPU_USAGE" >> $LOG_FILE
sleep $INTERVAL
done
# 计算峰值
PEAK=$(sort -n $LOG_FILE | tail -n 1)
echo "Peak CPU Usage: ${PEAK}%"
上述脚本首先定义监控的目标容器 ID、总时长和采样间隔。在循环中,它使用 --no-stream 标志执行 docker stats,并通过 --format 仅输出 CPU 百分比字段。接着,使用 grep -o 提取纯数字,避免单位符号干扰。每次采样后,将数值追加到日志文件。循环结束后,使用 sort -n 对日志中的数值进行排序,并取最后一行即为峰值。运行该脚本后,终端会直接打印出监控期间观察到的最高 CPU 使用率。
如何在容器内部使用 top 命令查看历史峰值
如果容器内部基于 Linux 且安装了 procps 包,可以直接进入容器使用 top 命令。虽然 top 默认显示的是实时状态,但通过特定参数可以查看进程的历史资源使用情况,特别是最大内存占用,对于 CPU,通常需要通过 /proc/[pid]/stat 文件进行更底层的分析,或者依赖 docker stats 的外部采集。这里主要介绍一种利用 top 交互模式查看瞬时峰值的技巧,以及结合 awk 进行非交互式采样的方法。
Docker Hub (hub.docker.com)。此技能适用于所有 Docker Hub 操作,包括读取、创建、更新和删除数据。只要任务涉及 Docker Hub,就使用此技能。

# 在宿主机上执行,针对特定 PID 进行多次采样
PID=$(docker inspect --format '{{.State.Pid}}' my_container)
for i in {1..10}; do
top -b -p $PID -n 1 | awk '/^ *$PID/ {print $9}'
sleep 2
done | sort -n | tail -n 1
这段代码首先通过 docker inspect 获取容器的宿主进程 ID (PID)。然后,使用 top -b 以批处理模式运行,配合 -p $PID 指定目标进程,-n 1 表示只输出一行数据。通过 awk 提取第 9 列,即 CPU 使用率百分比。循环执行 10 次,每次间隔 2 秒,将所有采样结果通过管道传递给 sort -n 排序,最后用 tail -n 1 取出最大值。这种方法比轮询整个容器统计信息更轻量,因为它只关注特定进程的资源消耗,适合在资源受限的环境中排查高 CPU 问题。
为什么 docker stats 显示的 CPU 百分比可能超过 100%
在使用 docker stats 时,用户可能会观察到 CPU 使用率超过 100% 的情况。这并非错误,而是因为 Docker 默认将宿主机的所有 CPU 核心数视为 100%。例如,在一个 4 核的宿主机上,如果一个容器占用了全部 4 个核心的算力,其 CPU 使用率将显示为 400%。理解这一计算逻辑对于正确解读监控数据至关重要。










