Docker stats 命令(建议收藏)

Docker stats 命令:实时监控容器资源使用情况的利器

在使用 Docker 进行开发与部署时,我们常常会遇到这样的场景:某个容器突然变得卡顿,响应变慢,甚至崩溃。这时候,你可能会想:“这容器到底在吃多少内存?CPU 资源是不是被占满了?” 这时,Docker stats 命令就显得尤为重要了。

这个命令就像是你给容器装上了一个“实时健康监测仪”,它能让你随时看到容器的 CPU 使用率、内存占用、网络流量、磁盘读写等关键指标。对于初学者来说,掌握它,就等于掌握了排查容器问题的第一把钥匙。


什么是 Docker stats 命令?

Docker stats 命令是 Docker 自带的一个实用工具,用于实时显示一个或多个容器的资源使用情况。它会以动态刷新的方式(默认每秒一次)展示容器的运行状态,帮助你快速判断容器是否在“超负荷工作”。

你可以把它想象成一台跑步机上的心率监测仪:当你在跑步时,仪器会持续告诉你心跳速度、运动强度。同样,Docker stats 会持续告诉你容器的“心跳”——CPU 和内存的使用情况。

💡 提示:这个命令不会对容器本身造成任何影响,它只是“观察者”,不会干预容器运行。


基本语法与常用参数

Docker stats 命令的语法非常简洁:

docker stats [OPTIONS] [CONTAINER...]

其中,[CONTAINER...] 可以是容器 ID、容器名,也可以省略表示监控所有正在运行的容器。

常用参数说明

参数 作用
--no-stream 仅输出一次统计数据,不持续刷新
--format 自定义输出格式,支持模板语法
--help 查看帮助信息

我们来看几个典型用法:

docker stats

docker stats my-nginx

docker stats web-app db-container

docker stats --no-stream

小贴士:如果你只想看一次数据,加 --no-stream 参数,避免一直输出。


实际案例:排查一个“卡死”的 Web 容器

假设你正在运行一个基于 Nginx 的 Web 服务,突然发现页面加载极慢。我们用 Docker stats 来排查问题。

步骤 1:启动一个 Nginx 容器

docker run -d --name web-server -p 8080:80 nginx:latest

注释:-d 表示后台运行,-p 8080:80 将宿主机的 8080 端口映射到容器的 80 端口,nginx:latest 是镜像名称。

步骤 2:运行 Docker stats 监控

docker stats web-server

运行后你会看到类似这样的输出:

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O     PIDS
a1b2c3d4e5f6   web-server  0.12%     15.3 MiB / 1 GiB       1.5%      2.3 kB / 1.2 MB   0 B / 0 B     5

字段详解

字段 含义
CONTAINER ID 容器的唯一标识符
NAME 容器名称
CPU % CPU 使用率(相对于单个 CPU 核心)
MEM USAGE / LIMIT 当前内存使用量 / 容器内存限制
MEM % 内存使用百分比
NET I/O 网络输入/输出流量
BLOCK I/O 磁盘读写 I/O(块设备)
PIDS 容器内进程数

📌 关键观察点:如果 CPU% 持续超过 90%,或 MEM % 接近 100%,说明容器可能资源不足。


自定义输出格式:让数据更清晰

默认输出虽然直观,但有时候我们只需要关注某几个指标。这时就可以用 --format 参数自定义输出内容。

比如,只显示容器名、CPU 使用率和内存使用率:

docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

输出示例:

NAME        CPU %     MEM USAGE / LIMIT
web-server  0.12%     15.3 MiB / 1 GiB

支持的模板变量

变量 含义
{{.Name}} 容器名称
{{.CPUPerc}} CPU 使用率
{{.MemUsage}} 内存使用量
{{.MemPerc}} 内存使用百分比
{{.NetIO}} 网络 I/O
{{.BlockIO}} 块 I/O

建议:在自动化脚本中使用 --format,可以方便地提取数据做进一步分析。


结合其他命令使用:更高效的排查方式

Docker stats 本身是“只读”的,但我们可以把它和其他命令结合使用,形成一套完整的排查流程。

1. 查看容器是否运行

docker ps

用于确认容器是否正在运行,如果状态是 Exited,说明容器已经停止。

2. 查看容器日志(辅助分析)

docker logs web-server

日志可能包含应用崩溃、内存溢出等关键信息,和 stats 配合使用,能更快定位问题。

3. 查看容器资源限制(是否设了内存上限)

docker inspect web-server

输出中会包含 MemoryCpuShares 等字段,可以查看容器的资源限制配置。


高级技巧:定时采集数据用于分析

如果你需要长期监控某个容器的资源变化,可以将 Docker stats 的输出导出到文件。

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" \
  web-server > stats.log

这样你就可以在后续用脚本分析 stats.log 文件,绘制资源使用趋势图。

💡 进阶提示:结合 Python 或 Shell 脚本,可以实现自动报警功能,比如当 CPU 超过 80% 持续 10 秒,就发送通知。


常见问题与解决方案

问题 1:Docker stats 显示 CPU 使用率过高,但容器实际没负载

可能原因:容器内运行了无限循环的脚本,或存在内存泄漏。

解决方法

  • 检查容器内部进程:docker exec -it web-server ps aux
  • 查看是否有多余的进程在占用 CPU。

问题 2:MEM % 接近 100%,但容器未崩溃

可能原因:容器设置了内存上限,但应用内存使用接近上限。

解决方法

  • 通过 docker inspect 查看内存限制
  • 增加内存限制(需重启容器):docker run -m 2g ...

问题 3:Docker stats 无法显示某个容器

可能原因:容器已停止或被删除。

解决方法

  • 使用 docker ps -a 查看所有容器(包括已停止的)
  • 确保容器处于 Running 状态

总结:为什么你应该掌握 Docker stats 命令

Docker stats 命令虽小,却是排查容器问题的“第一道防线”。它不复杂,但非常实用。无论是初学者调试本地环境,还是中级开发者排查线上服务,这个命令都能帮你快速定位资源瓶颈。

它就像一个“容器体检表”,让你不再靠“感觉”判断问题,而是用数据说话。掌握它,意味着你离真正理解容器化应用的运行机制又近了一步。

下次当你遇到容器卡顿、响应慢时,别急着重启,先运行一句 docker stats,也许答案就在那几行数据里。

📌 最后提醒:在生产环境中,建议将 Docker stats 与其他监控工具(如 Prometheus + cAdvisor)结合使用,实现更全面的可观测性。但作为入门,Docker stats 已经足够强大。