Docker stats 命令:全方位监控容器资源
Docker stats 命令:全方位监控容器资源
-
- 1. 命令概述
- 2. 命令语法
- 3. 参数详解
- 4. 监控指标架构
- 5. 典型输出解析
- 6. 使用场景图解
- 7. 高级使用技巧
-
- 7.1 自定义格式输出
- 7.2 JSON格式输出
- 8. 监控数据流分析
- 9. 实战案例集
-
- 9.1 监控指定容器组
- 9.2 资源异常告警脚本
- 9.3 生成监控报告
- 10. 性能优化指南
- 11. 常见问题排查
-
- 11.1 问题:stats显示异常值
- 11.2 问题:stats无输出
- 12. 与其他监控工具对比
- 13. 最佳实践
- 14. 总结
1. 命令概述
docker stats
是 Docker 提供的容器资源监控利器,能够实时显示容器的 CPU、内存、网络和磁盘 I/O 等关键指标,相当于 Linux 系统中的 top
命令的容器专属版本。
2. 命令语法
docker stats [OPTIONS] [CONTAINER...]
3. 参数详解
--all
-a
docker stats -a
--format
docker stats --format \"{{.Name}} {{.CPUPerc}}\"
--no-stream
docker stats --no-stream
--no-trunc
docker stats --no-trunc
4. 监控指标架构
#mermaid-svg-bfyDmOG6BaX4kCon {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .error-icon{fill:#552222;}#mermaid-svg-bfyDmOG6BaX4kCon .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bfyDmOG6BaX4kCon .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bfyDmOG6BaX4kCon .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bfyDmOG6BaX4kCon .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bfyDmOG6BaX4kCon .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bfyDmOG6BaX4kCon .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bfyDmOG6BaX4kCon .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bfyDmOG6BaX4kCon .marker.cross{stroke:#333333;}#mermaid-svg-bfyDmOG6BaX4kCon svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bfyDmOG6BaX4kCon .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .cluster-label text{fill:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .cluster-label span{color:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .label text,#mermaid-svg-bfyDmOG6BaX4kCon span{fill:#333;color:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .node rect,#mermaid-svg-bfyDmOG6BaX4kCon .node circle,#mermaid-svg-bfyDmOG6BaX4kCon .node ellipse,#mermaid-svg-bfyDmOG6BaX4kCon .node polygon,#mermaid-svg-bfyDmOG6BaX4kCon .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bfyDmOG6BaX4kCon .node .label{text-align:center;}#mermaid-svg-bfyDmOG6BaX4kCon .node.clickable{cursor:pointer;}#mermaid-svg-bfyDmOG6BaX4kCon .arrowheadPath{fill:#333333;}#mermaid-svg-bfyDmOG6BaX4kCon .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bfyDmOG6BaX4kCon .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bfyDmOG6BaX4kCon .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bfyDmOG6BaX4kCon .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bfyDmOG6BaX4kCon .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bfyDmOG6BaX4kCon .cluster text{fill:#333;}#mermaid-svg-bfyDmOG6BaX4kCon .cluster span{color:#333;}#mermaid-svg-bfyDmOG6BaX4kCon div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bfyDmOG6BaX4kCon :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 监控指标 采集 采集 采集 聚合展示 CPU使用率 stats输出 内存使用 网络IO 块IO 进程数 宿主机Docker引擎 容器1 容器2 容器3
5. 典型输出解析
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDSa1b2c3d4e5f6 web-server 0.15% 120MiB / 3.84GiB 3.05% 1.2MB/350kB 25MB/10MB 15d7e8f9g0h1i2 db-server 2.35% 1.2GiB / 3.84GiB 31.25% 45kB/1.1MB 1.2GB/500MB 8
指标说明:
- CPU %:容器使用的 CPU 百分比(所有核心的总和)
- MEM USAGE / LIMIT:当前内存使用量 / 内存限制
- NET I/O:网络输入/输出流量
- BLOCK I/O:块设备输入/输出数据量
- PIDS:容器内进程/线程数
6. 使用场景图解
7. 高级使用技巧
7.1 自定义格式输出
docker stats --format \"table {{.Container}}\\t{{.Name}}\\t{{.CPUPerc}}\\t{{.MemPerc}}\"
可用字段:
.Container
:容器ID.Name
:容器名称.ID
:容器完整ID.CPUPerc
:CPU百分比.MemUsage
:内存使用量.NetIO
:网络IO.BlockIO
:块IO.MemPerc
:内存百分比.PIDs
:进程数
7.2 JSON格式输出
docker stats --no-stream --format \"{{ json . }}\"
输出示例:
{ \"BlockIO\": \"25MB / 10MB\", \"CPUPerc\": \"0.15%\", \"Container\": \"a1b2c3d4e5f6\", \"MemPerc\": \"3.05%\", \"MemUsage\": \"120MiB / 3.84GiB\", \"Name\": \"web-server\", \"NetIO\": \"1.2MB / 350kB\", \"PIDs\": \"15\"}
8. 监控数据流分析
#mermaid-svg-j4oVR0mmH0975pJx {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-j4oVR0mmH0975pJx .error-icon{fill:#552222;}#mermaid-svg-j4oVR0mmH0975pJx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-j4oVR0mmH0975pJx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-j4oVR0mmH0975pJx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-j4oVR0mmH0975pJx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-j4oVR0mmH0975pJx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-j4oVR0mmH0975pJx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-j4oVR0mmH0975pJx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-j4oVR0mmH0975pJx .marker.cross{stroke:#333333;}#mermaid-svg-j4oVR0mmH0975pJx svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-j4oVR0mmH0975pJx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-j4oVR0mmH0975pJx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-j4oVR0mmH0975pJx .actor-line{stroke:grey;}#mermaid-svg-j4oVR0mmH0975pJx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-j4oVR0mmH0975pJx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-j4oVR0mmH0975pJx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-j4oVR0mmH0975pJx .sequenceNumber{fill:white;}#mermaid-svg-j4oVR0mmH0975pJx #sequencenumber{fill:#333;}#mermaid-svg-j4oVR0mmH0975pJx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-j4oVR0mmH0975pJx .messageText{fill:#333;stroke:#333;}#mermaid-svg-j4oVR0mmH0975pJx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-j4oVR0mmH0975pJx .labelText,#mermaid-svg-j4oVR0mmH0975pJx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-j4oVR0mmH0975pJx .loopText,#mermaid-svg-j4oVR0mmH0975pJx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-j4oVR0mmH0975pJx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-j4oVR0mmH0975pJx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-j4oVR0mmH0975pJx .noteText,#mermaid-svg-j4oVR0mmH0975pJx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-j4oVR0mmH0975pJx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-j4oVR0mmH0975pJx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-j4oVR0mmH0975pJx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-j4oVR0mmH0975pJx .actorPopupMenu{position:absolute;}#mermaid-svg-j4oVR0mmH0975pJx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-j4oVR0mmH0975pJx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-j4oVR0mmH0975pJx .actor-man circle,#mermaid-svg-j4oVR0mmH0975pJx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-j4oVR0mmH0975pJx :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} User Docker_Engine Containers docker stats 获取CPU数据 获取内存数据 获取网络IO 获取块IO loop [每秒采集] 返回统计数据 User Docker_Engine Containers
9. 实战案例集
9.1 监控指定容器组
docker stats nginx mysql redis
9.2 资源异常告警脚本
#!/bin/bashTHRESHOLD=80while true; do docker stats --no-stream --format \"{{.Name}} {{.CPUPerc}} {{.MemPerc}}\" | \\ while read -r name cpu mem; do cpu_val=${cpu%\\%} mem_val=${mem%\\%} if (( $(echo \"$cpu_val > $THRESHOLD\" | bc -l) ) || \\ (( $(echo \"$mem_val > $THRESHOLD\" | bc -l) )); then echo \"[警告] 容器 $name 资源使用过高: CPU=$cpu, 内存=$mem\" fi done sleep 5done
9.3 生成监控报告
docker stats --no-stream --format \"table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.NetIO}}\" > container_stats_$(date +%Y%m%d).log
10. 性能优化指南
#mermaid-svg-aVUoUCGrUs00RodU {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aVUoUCGrUs00RodU .error-icon{fill:#552222;}#mermaid-svg-aVUoUCGrUs00RodU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aVUoUCGrUs00RodU .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-aVUoUCGrUs00RodU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aVUoUCGrUs00RodU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aVUoUCGrUs00RodU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aVUoUCGrUs00RodU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aVUoUCGrUs00RodU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aVUoUCGrUs00RodU .marker.cross{stroke:#333333;}#mermaid-svg-aVUoUCGrUs00RodU svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aVUoUCGrUs00RodU .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aVUoUCGrUs00RodU .cluster-label text{fill:#333;}#mermaid-svg-aVUoUCGrUs00RodU .cluster-label span{color:#333;}#mermaid-svg-aVUoUCGrUs00RodU .label text,#mermaid-svg-aVUoUCGrUs00RodU span{fill:#333;color:#333;}#mermaid-svg-aVUoUCGrUs00RodU .node rect,#mermaid-svg-aVUoUCGrUs00RodU .node circle,#mermaid-svg-aVUoUCGrUs00RodU .node ellipse,#mermaid-svg-aVUoUCGrUs00RodU .node polygon,#mermaid-svg-aVUoUCGrUs00RodU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aVUoUCGrUs00RodU .node .label{text-align:center;}#mermaid-svg-aVUoUCGrUs00RodU .node.clickable{cursor:pointer;}#mermaid-svg-aVUoUCGrUs00RodU .arrowheadPath{fill:#333333;}#mermaid-svg-aVUoUCGrUs00RodU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aVUoUCGrUs00RodU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aVUoUCGrUs00RodU .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-aVUoUCGrUs00RodU .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-aVUoUCGrUs00RodU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aVUoUCGrUs00RodU .cluster text{fill:#333;}#mermaid-svg-aVUoUCGrUs00RodU .cluster span{color:#333;}#mermaid-svg-aVUoUCGrUs00RodU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aVUoUCGrUs00RodU :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 高CPU使用 检查应用线程 限制CPU份额 高内存使用 调整JVM参数 限制内存 高IO 优化存储驱动 使用volume
优化建议:
- 使用
--cpus
参数限制CPU使用 - 通过
-m
参数限制内存 - 对IO密集型应用使用
--device-read-bps
限制磁盘IO - 考虑使用
docker update
动态调整资源限制
11. 常见问题排查
11.1 问题:stats显示异常值
可能原因:
- 容器刚启动,数据尚未稳定
- 容器处于僵尸状态
- 宿主机资源紧张
解决方案:
# 检查容器状态docker inspect <container># 查看宿主机资源topfree -h
11.2 问题:stats无输出
排查步骤:
- 确认容器是否运行:
docker ps
- 检查Docker服务状态:
systemctl status docker
- 尝试指定容器ID:
docker stats
12. 与其他监控工具对比
docker stats
13. 最佳实践
- 长期监控:生产环境建议结合 Prometheus + Grafana
- 基准测试:记录正常运行的基准指标
- 告警设置:对关键指标设置阈值告警
- 文档记录:保存历史数据用于趋势分析
14. 总结
docker stats
作为 Docker 原生监控工具,具有以下优势:
- 零配置开箱即用
- 实时反映容器状态
- 丰富的监控维度
- 灵活的输出格式
通过本文的深度解析,您应该已经掌握:
- 各种参数的使用场景
- 监控数据的解读方法
- 常见问题的排查思路
- 生产环境的优化建议
记住,良好的监控习惯是容器化应用稳定运行的基石。建议将 docker stats
作为日常运维的标准工具,结合其他监控方案构建完整的监控体系。