当前位置: 首页 > news >正文

第七部分-容器安全与监控——34. 容器监控

34. 容器监控

1. 容器监控概述

容器监控是保障容器化应用稳定运行的关键环节,包括资源监控、性能监控、健康检查和告警等。本节将介绍主流容器监控方案。

┌─────────────────────────────────────────────────────────────┐ │ 容器监控架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 数据采集层 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │cAdvisor │ │Node │ │Prometheus│ │ │ │ │ │ │ │Exporter │ │Client │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └───────┼────────────┼────────────┼────────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 存储层 │ │ │ │ Prometheus / InfluxDB │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 可视化层 │ │ │ │ Grafana / Kibana / Datadog │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. 基础监控命令

2.1 Docker Stats

# 查看所有容器资源使用dockerstats# 查看特定容器dockerstats container1 container2# 只显示当前状态(不持续刷新)dockerstats --no-stream# 格式化输出dockerstats--format"table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"# 只看 CPU 和内存dockerstats--format"{{.Name}}: CPU={{.CPUPerc}} MEM={{.MemUsage}}"# 输出到文件dockerstats --no-stream>stats.log

2.2 Docker Top

# 查看容器内进程dockertopcontainer_name# 查看带详细信息的进程dockertopcontainer_name aux# 查看特定 PIDdockertopcontainer_name1# 自定义输出字段dockertopcontainer_name-eopid,comm,pcpu,pmem

2.3 Docker Inspect

# 查看容器状态dockerinspect container_name--format='{{.State.Status}}'# 查看容器退出码dockerinspect container_name--format='{{.State.ExitCode}}'# 查看容器启动时间dockerinspect container_name--format='{{.State.StartedAt}}'# 查看容器资源限制dockerinspect container_name--format='{{.HostConfig.Memory}}'# 查看容器网络设置dockerinspect container_name--format='{{.NetworkSettings}}'

3. cAdvisor

3.1 部署 cAdvisor

# 运行 cAdvisor 容器dockerrun-d\--namecadvisor\--restartalways\-p8080:8080\-v/:/rootfs:ro\-v/var/run:/var/run:ro\-v/sys:/sys:ro\-v/var/lib/docker/:/var/lib/docker:ro\-v/dev/disk/:/dev/disk:ro\gcr.io/cadvisor/cadvisor:latest# 访问界面# http://localhost:8080# 查看 Docker 容器指标# http://localhost:8080/docker/

3.2 cAdvisor 指标

# 获取 cAdvisor 指标curlhttp://localhost:8080/metrics# 常见指标# container_cpu_usage_seconds_total# container_memory_usage_bytes# container_network_receive_bytes_total# container_fs_usage_bytes

4. Prometheus + Grafana

4.1 部署 Prometheus

# prometheus.ymlglobal:scrape_interval:15sevaluation_interval:15sscrape_configs:-job_name:'docker'static_configs:-targets:['cadvisor:8080','node-exporter:9100']-job_name:'prometheus'static_configs:-targets:['localhost:9090']
# 运行 Prometheusdockerrun-d\--nameprometheus\-p9090:9090\-v$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml\prom/prometheus

4.2 部署 Node Exporter

# 运行 Node Exporterdockerrun-d\--namenode-exporter\--restartalways\-p9100:9100\-v/proc:/host/proc:ro\-v/sys:/host/sys:ro\-v/:/rootfs:ro\prom/node-exporter

4.3 部署 Grafana

# 运行 Grafanadockerrun-d\--namegrafana\-p3000:3000\-eGF_SECURITY_ADMIN_PASSWORD=admin\grafana/grafana# 访问 http://localhost:3000# 用户名: admin# 密码: admin

4.4 Grafana 配置

# 添加 Prometheus 数据源# URL: http://prometheus:9090# 导入 Docker 监控面板# Dashboard ID: 193 (Docker Monitoring)# Dashboard ID: 179 (Docker Engine Metrics)

5. 健康检查

5.1 Dockerfile 健康检查

# Dockerfile 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/ || exit 1 # 自定义健康检查脚本 HEALTHCHECK --interval=30s \ CMD /app/healthcheck.sh

5.2 运行时健康检查

# 创建带健康检查的容器dockerrun-d\--nameweb\--health-cmd="curl -f http://localhost/ || exit 1"\--health-interval=30s\--health-timeout=3s\--health-retries=3\--health-start-period=10s\nginx# 查看健康状态dockerinspect--format='{{.State.Health.Status}}'web# 查看健康检查日志dockerinspect--format='{{json .State.Health}}'web|jq

6. 告警配置

6.1 Prometheus 告警规则

# alert.rulesgroups:-name:containerrules:-alert:ContainerHighCPUexpr:sum(rate(container_cpu_usage_seconds_total[5m])) by (name)>0.8for:5mlabels:severity:warningannotations:summary:"Container {{ $labels.name }} CPU usage high"-alert:ContainerHighMemoryexpr:container_memory_usage_bytes / container_spec_memory_limit_bytes>0.9for:5mlabels:severity:warningannotations:summary:"Container {{ $labels.name }} memory usage high"-alert:ContainerDownexpr:time()-container_last_seen>60for:1mlabels:severity:criticalannotations:summary:"Container {{ $labels.name }} is down"

6.2 AlertManager 配置

# alertmanager.ymlroute:group_by:['alertname']group_wait:10sgroup_interval:10srepeat_interval:1hreceiver:'email'receivers:-name:'email'email_configs:-to:'admin@example.com'from:'alertmanager@example.com'smarthost:'smtp.example.com:587'auth_username:'user'auth_password:'password'-name:'webhook'webhook_configs:-url:'http://webhook.example.com/alert'

7. 监控脚本

7.1 资源监控脚本

#!/bin/bash# monitor.shwhiletrue;doecho"=====$(date)====="# CPU 使用率echo"CPU Usage:"dockerstats --no-stream--format"{{.Name}}: {{.CPUPerc}}"# 内存使用echo"Memory Usage:"dockerstats --no-stream--format"{{.Name}}: {{.MemUsage}}"# 容器状态echo"Container Status:"dockerps--format"table {{.Names}}\t{{.Status}}"sleep60done

7.2 告警脚本

#!/bin/bash# alert.shTHRESHOLD_CPU=80THRESHOLD_MEM=90whilereadcontainer;doCPU=$(dockerstats --no-stream--format"{{.CPUPerc}}"$container|tr-d'%')MEM=$(dockerstats --no-stream--format"{{.MemPerc}}"$container|tr-d'%')if(($(echo "$CPU>$THRESHOLD_CPU"|bc-l)));thenecho"WARNING: Container$containerCPU usage:${CPU}%"# 发送告警fiif(($(echo "$MEM>$THRESHOLD_MEM"|bc-l)));thenecho"WARNING: Container$containerMemory usage:${MEM}%"# 发送告警fidone<<(dockerps-q)

8. 性能分析工具

8.1 Docker Events

# 实时监控 Docker 事件dockerevents# 过滤特定事件dockerevents--filterevent=startdockerevents--filterevent=diedockerevents--filterevent=oom# 过滤特定容器dockerevents--filtercontainer=web# 时间范围dockerevents--since1h--until30m

8.2 Docker System

# 磁盘使用情况dockersystemdfdockersystemdf-v# 清理命令dockersystem prunedockersystem prune-a--volumes

9. 监控最佳实践

✅ 推荐做法

  1. 多层次监控:容器、宿主机、应用
  2. 关键指标:CPU、内存、网络、磁盘 I/O
  3. 健康检查:配置应用健康检查
  4. 日志监控:集中日志收集
  5. 告警配置:设置合理阈值
  6. 数据保留:根据需求设置保留策略

❌ 避免事项

  • 监控指标过多导致性能问题
  • 告警阈值设置不当产生噪音
  • 忽略健康检查配置
  • 没有可视化面板

10. 常用命令速查

操作命令
实时监控docker stats
查看进程docker top
查看事件docker events
磁盘使用docker system df
健康检查docker inspect --format='{{.State.Health.Status}}'
cAdvisordocker run -d -p 8080:8080 gcr.io/cadvisor/cadvisor
Prometheusdocker run -d -p 9090:9090 prom/prometheus
Grafanadocker run -d -p 3000:3000 grafana/grafana

11. 常见问题

Q1: docker stats 显示 0% 怎么回事?

容器可能刚启动或处于空闲状态,等待一段时间。

Q2: 如何监控容器内部应用?

使用应用性能监控(APM)工具,如 Jaeger、Zipkin。

Q3: Prometheus 如何发现容器?

使用 Docker Swarm 或 Kubernetes 的服务发现。

12. 小结

  • 基础监控:docker stats、top、events
  • cAdvisor:容器资源监控工具
  • Prometheus + Grafana:主流监控方案
  • 健康检查:应用可用性检测
  • 告警配置:及时发现问题
  • 监控脚本:自定义监控需求
  • 性能分析:系统级和容器级
  • 合理设置监控指标和告警阈值

http://www.jsqmd.com/news/801614/

相关文章:

  • 别再只复制粘贴了!深入理解阿里云IoT设备三元组:ProductKey、DeviceName、DeviceSecret的安全与管理实践
  • 别再怕触电了!手把手教你安全调试220V阻容降压电路(附实物接线图)
  • 告别串口助手!用STM32F103+DHT11做个OLED屏显温湿度计,附电路与程序
  • Android Studio可视化布局神器:ConstraintLayout Barrier的拖拽式实战教程
  • 基于FastAPI逆向封装Qwen官方接口,实现本地化AI对话API服务
  • SSRS报表中数据合并的艺术
  • 长期使用Taotoken聚合API的稳定性与可靠性观察
  • 淘金币自动化脚本:解放双手的终极指南
  • 在MATLAB与Unreal Engine中搭建自动驾驶高保真仿真环境
  • WarcraftHelper:如何让经典魔兽争霸3在现代系统上流畅运行?
  • Windows 11安卓子系统完整指南:让你的电脑秒变手机应用中心
  • 明日方舟基建自动化管理终极指南:如何用Arknights-Mower彻底解放双手
  • 从MATLAB报错‘错误使用open(第136行)’到函数命名冲突的深度排查
  • C++中vector与string的关键应用及区别解析
  • 1.Python中ORM基础启动连接步骤
  • Windows密码忘了怎么办?一分钟看懂Windows密码底层机制:无需重装系统也能无痕找回登录密码
  • 告别ImageNet!用CLIP+Prompt工程,5分钟搞定你的第一个零样本图像分类器
  • 2026花洒品牌排行榜推荐:口碑好高性价比国产花洒选购指南 - 博客湾
  • 终极免费工具:WindowResizer让你完全掌控Windows窗口大小
  • XUnity.AutoTranslator:Unity游戏实时本地化引擎的技术架构与实践
  • 厌氧发酵罐主流供应商硬核横评:佳德精密 vs 有道生工,谁才是你的“天选”方案? - 品牌推荐大师1
  • 【LLC】逻辑链路控制:数据链路层的“统一翻译官”与异构网络互联的幕后功臣
  • 项目经理实战指南:如何用权力/利益方格和凸显模型搞定难缠的客户与领导?(真实案例拆解)
  • Unity 气泡留言墙:无限滚动照片流的实现
  • 2026年二季度国内COD水质分析仪厂家十大品牌盘点 - 流量计品牌
  • Typora“激活”与“美化”实战指南
  • BetterOCR:基于LLM增强的本地化OCR工具,实现高精度文本识别与结构化处理
  • 基于Selenium的Web自动化任务执行器:从配置驱动到工程实践
  • 别再手动烧录了!用STM32CubeMX和串口IAP,5分钟搞定远程固件升级
  • 在峡谷中自由换装:R3nzSkin国服特供版的技术实现与实战指南