Docker stats 命令(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在容器化技术蓬勃发展的今天,Docker 已经成为开发者和运维人员的必备工具。随着应用容器化的普及,如何高效监控容器的运行状态和资源使用情况,成为优化系统性能的关键环节。本文将以 Docker stats 命令为核心,深入讲解这一工具的功能、参数、输出解析及实际应用场景。通过循序渐进的讲解和案例演示,帮助读者掌握如何通过命令行实时追踪容器资源消耗,为系统优化和故障排查提供数据支撑。


一、什么是 Docker stats 命令?

Docker stats 命令 是 Docker 提供的用于实时监控容器资源使用情况的工具。它能够以流式输出的形式,展示容器的 CPU、内存、网络和存储等指标,帮助开发者快速定位资源瓶颈或异常行为。

形象比喻
若将容器比作一辆正在行驶的汽车,Docker stats 就像车内的仪表盘,实时显示发动机转速(CPU)、油量(内存)、里程(存储)和油耗(网络流量)等关键数据。通过观察这些指标,驾驶员(开发者或运维人员)可以判断车辆(容器)是否处于最佳运行状态,或是否需要及时检修。


二、Docker stats 的基本用法

2.1 基础语法

docker stats [OPTIONS] [CONTAINER...]

此命令默认实时显示所有运行中容器的资源使用情况。若指定容器名称或 ID,则仅显示对应容器的数据。

2.2 示例:监控所有运行中的容器

docker stats

执行后,终端会持续输出类似以下表格:

CONTAINER ID   NAME      CPU %   MEM USAGE / LIMIT   MEM %   NET I/O   BLOCK I/O   PIDS
abc123         nginx     0.5%    20MiB / 1.94GiB     1%      12KB      150KB       4

2.3 常用参数

参数作用描述
--no-stream禁用流式输出,仅显示单次快照
--format自定义输出格式,支持 Go 模板语法
-a, --all包含停止状态的容器(需配合 --no-stream

三、输出字段详解

Docker stats 的输出包含多个关键列,理解这些字段的含义是分析容器状态的基础。

3.1 核心字段解析

列名含义及单位
CPU %容器占用的 CPU 百分比(相对于主机总资源)
MEM USAGE当前内存使用量(格式:已用/总限制)
MEM %内存使用百分比(相对于设置的内存上限)
NET I/O网络输入和输出总流量(单位:KB/MB)
BLOCK I/O磁盘读写总流量(单位:KB/MB)
PIDS容器内进程数量

比喻延伸
若将容器视为一个“资源消耗者”,则:

  • CPU % 是它吃掉的“食物”占比;
  • MEM USAGE 是它占用的“水池”容量;
  • NET I/O 是它发出的“通话”和“接收”的“邮件”量。

四、高级用法与案例

4.1 单次快照:使用 --no-stream

若仅需查看容器的当前状态而非实时监控,可通过 --no-stream 参数获取单次快照:

docker stats --no-stream nginx-container

输出示例:

abc123   nginx-container   0.3%    18MiB/1.94GiB   0.9%   8KB/2KB   140KB/50KB   3

4.2 自定义输出格式:--format 参数

通过 Go 模板语法,可按需筛选和格式化输出字段。例如,仅显示容器名称、CPU 和内存使用率:

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

输出示例:

NAME          CPU %   MEM %  
nginx         0.5%    1%  
webapp        2.3%    15%  

4.3 结合其他命令筛选容器

若需监控特定标签(Label)的容器,可先通过 docker ps 过滤,再传入 docker stats

docker ps --filter "label=environment=production" -q | xargs docker stats

五、实际场景与问题排查

5.1 场景 1:内存泄漏检测

若发现某个容器的 MEM % 持续上升且接近 100%,可能表示内存泄漏。此时可结合 docker inspect 查看内存限制,并考虑调整 --memory 参数或检查应用逻辑。

5.2 场景 2:CPU 过载分析

CPU % 突然飙升,需进一步分析原因。例如,若容器运行的是 Web 服务,可能因高并发请求导致 CPU 负荷过大。此时可通过以下步骤排查:

  1. 使用 docker top <container> 查看容器内的活跃进程;
  2. 结合 htoptop 命令在宿主机观察全局 CPU 占用情况;
  3. 根据结果决定是否需要扩容容器或优化代码。

5.3 场景 3:网络流量异常

NET I/O 的输出值在短时间内激增,可能表示容器存在网络层问题(如 DDOS 攻击或配置错误)。此时可执行 docker network inspect 检查网络配置,或通过 tcpdump 抓包分析流量详情。


六、与 Docker 其他命令的联动

6.1 与 docker run 结合设置资源限制

在启动容器时,可通过 --cpus--memory 等参数定义资源上限,再通过 docker stats 监控实际使用情况:

docker run -d --name test --cpus="0.5" --memory="512m" nginx
docker stats test

6.2 与 docker events 结合监控动态事件

若需同时追踪容器的启动/停止事件和资源使用,可结合 docker events

docker stats & docker events --filter "event=start"

七、最佳实践与注意事项

  1. 避免资源争抢:通过 docker stats 监控发现资源不足时,及时调整容器的资源配额,避免影响其他容器或宿主机性能。
  2. 长期监控与日志记录:若需长期记录数据,可通过 docker stats --no-stream 定时执行并重定向到文件,或结合 cron 任务实现自动化。
  3. 对比基线数据:定期记录正常状态下的指标作为基线,便于后续快速识别异常波动。

八、总结

Docker stats 命令 是容器监控的“瑞士军刀”,通过直观的实时数据输出,帮助开发者快速掌握容器的资源使用模式。从基础语法到高级用法,从问题排查到最佳实践,本文覆盖了这一工具的核心知识点。无论是优化应用性能、排查故障,还是实现自动化监控,Docker stats 都是不可或缺的工具。

下一步行动建议

  • 立即尝试用 docker stats 监控本地运行的容器;
  • 通过自定义格式输出,生成符合业务需求的监控报表;
  • 结合 --no-stream 和脚本,构建轻量级容器监控系统。

掌握 Docker stats,就是掌握了容器化时代运维效率的关键钥匙。

最新发布