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--formattable {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}# 只看 CPU 和内存dockerstats--format{{.Name}}: CPU{{.CPUPerc}} MEM{{.MemUsage}}# 输出到文件dockerstats --no-streamstats.log2.2 Docker Top# 查看容器内进程dockertopcontainer_name# 查看带详细信息的进程dockertopcontainer_name aux# 查看特定 PIDdockertopcontainer_name1# 自定义输出字段dockertopcontainer_name-eopid,comm,pcpu,pmem2.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. cAdvisor3.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_bytes4. Prometheus Grafana4.1 部署 Prometheus# prometheus.ymlglobal:scrape_interval:15sevaluation_interval:15sscrape_configs:-job_name:dockerstatic_configs:-targets:[cadvisor:8080,node-exporter:9100]-job_name:prometheusstatic_configs:-targets:[localhost:9090]# 运行 Prometheusdockerrun-d\--nameprometheus\-p9090:9090\-v$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml\prom/prometheus4.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-exporter4.3 部署 Grafana# 运行 Grafanadockerrun-d\--namegrafana\-p3000:3000\-eGF_SECURITY_ADMIN_PASSWORDadmin\grafana/grafana# 访问 http://localhost:3000# 用户名: admin# 密码: admin4.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 --interval30s --timeout3s --start-period5s --retries3 \ CMD curl -f http://localhost/ || exit 1 # 自定义健康检查脚本 HEALTHCHECK --interval30s \ CMD /app/healthcheck.sh5.2 运行时健康检查# 创建带健康检查的容器dockerrun-d\--nameweb\--health-cmdcurl -f http://localhost/ || exit 1\--health-interval30s\--health-timeout3s\--health-retries3\--health-start-period10s\nginx# 查看健康状态dockerinspect--format{{.State.Health.Status}}web# 查看健康检查日志dockerinspect--format{{json .State.Health}}web|jq6. 告警配置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_bytes0.9for:5mlabels:severity:warningannotations:summary:Container {{ $labels.name }} memory usage high-alert:ContainerDownexpr:time()-container_last_seen60for:1mlabels:severity:criticalannotations:summary:Container {{ $labels.name }} is down6.2 AlertManager 配置# alertmanager.ymlroute:group_by:[alertname]group_wait:10sgroup_interval:10srepeat_interval:1hreceiver:emailreceivers:-name:emailemail_configs:-to:adminexample.comfrom:alertmanagerexample.comsmarthost:smtp.example.com:587auth_username:userauth_password:password-name:webhookwebhook_configs:-url:http://webhook.example.com/alert7. 监控脚本7.1 资源监控脚本#!/bin/bash# monitor.shwhiletrue;doecho$(date)# CPU 使用率echoCPU Usage:dockerstats --no-stream--format{{.Name}}: {{.CPUPerc}}# 内存使用echoMemory Usage:dockerstats --no-stream--format{{.Name}}: {{.MemUsage}}# 容器状态echoContainer Status:dockerps--formattable {{.Names}}\t{{.Status}}sleep60done7.2 告警脚本#!/bin/bash# alert.shTHRESHOLD_CPU80THRESHOLD_MEM90whilereadcontainer;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)));thenechoWARNING: Container$containerCPU usage:${CPU}%# 发送告警fiif(($(echo $MEM$THRESHOLD_MEM|bc-l)));thenechoWARNING: Container$containerMemory usage:${MEM}%# 发送告警fidone(dockerps-q)8. 性能分析工具8.1 Docker Events# 实时监控 Docker 事件dockerevents# 过滤特定事件dockerevents--filtereventstartdockerevents--filtereventdiedockerevents--filtereventoom# 过滤特定容器dockerevents--filtercontainerweb# 时间范围dockerevents--since1h--until30m8.2 Docker System# 磁盘使用情况dockersystemdfdockersystemdf-v# 清理命令dockersystem prunedockersystem prune-a--volumes9. 监控最佳实践✅ 推荐做法多层次监控容器、宿主机、应用关键指标CPU、内存、网络、磁盘 I/O健康检查配置应用健康检查日志监控集中日志收集告警配置设置合理阈值数据保留根据需求设置保留策略❌ 避免事项监控指标过多导致性能问题告警阈值设置不当产生噪音忽略健康检查配置没有可视化面板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/cadvisorPrometheusdocker run -d -p 9090:9090 prom/prometheusGrafanadocker run -d -p 3000:3000 grafana/grafana11. 常见问题Q1: docker stats 显示 0% 怎么回事容器可能刚启动或处于空闲状态等待一段时间。Q2: 如何监控容器内部应用使用应用性能监控APM工具如 Jaeger、Zipkin。Q3: Prometheus 如何发现容器使用 Docker Swarm 或 Kubernetes 的服务发现。12. 小结基础监控docker stats、top、eventscAdvisor容器资源监控工具Prometheus Grafana主流监控方案健康检查应用可用性检测告警配置及时发现问题监控脚本自定义监控需求性能分析系统级和容器级合理设置监控指标和告警阈值