温馨提示×

Docker在Debian上的监控与告警如何实现

小樊
43
2025-12-24 19:44:31
栏目: 智能运维

在 Debian 上搭建 Docker 监控与告警

一 架构与组件

  • 采集层
    • cAdvisor:采集容器级指标(CPU、内存、网络、文件系统),默认暴露 /metrics 端点,部署为容器即可覆盖本机所有容器。
    • Node Exporter(可选):采集主机级指标(CPU、内存、磁盘、Swap 等),与容器指标互补。
  • 存储与查询
    • Prometheus:按配置的抓取间隔拉取指标,支持 PromQL 查询与规则评估,作为告警规则引擎。
  • 可视化
    • Grafana:对接 Prometheus 数据源,提供丰富的容器与主机仪表盘。
  • 告警路由与通知
    • Alertmanager:对 Prometheus 触发的告警进行分组、抑制、静默与路由,支持 邮件、Slack、Webhook 等通知方式。
  • 典型数据流
    • Docker 容器 → cAdvisor → Prometheus(评估告警)→ Alertmanager(路由与通知);主机指标由 Node Exporter 供 Prometheus 抓取。

二 快速部署步骤

  • 准备
    • 系统:Debian 11/12(内核 ≥ 3.10),已安装 DockerDocker Compose(建议 Docker ≥ 20.10、Compose ≥ 2.0)。
    • 端口规划:确保 9090(Prometheus)、3000(Grafana)、9100(Node Exporter)、8080(cAdvisor)未被占用。
  • 一键 Compose 示例(单主机)
    • 目录与编排文件(/opt/prometheus-docker/docker-compose.yml):
      version: '3.8'
      services:
        prometheus:
          image: prom/prometheus:v2.45.0
          container_name: prometheus
          restart: always
          ports:
            - "9090:9090"
          volumes:
            - ./prometheus.yml:/etc/prometheus/prometheus.yml
            - prometheus-data:/prometheus
          command:
            - '--config.file=/etc/prometheus/prometheus.yml'
            - '--storage.tsdb.path=/prometheus'
            - '--web.console.libraries=/usr/share/prometheus/console_libraries'
            - '--web.console.templates=/usr/share/prometheus/consoles'
          networks:
            - prom-net
      
        cadvisor:
          image: gcr.io/cadvisor/cadvisor:v0.47.0
          container_name: cadvisor
          restart: always
          ports:
            - "8080:8080"
          volumes:
            - /:/rootfs:ro
            - /var/run:/var/run:ro
            - /sys:/sys:ro
            - /var/lib/docker/:/var/lib/docker:ro
            - /dev/disk/:/dev/disk:ro
          networks:
            - prom-net
      
        node-exporter:
          image: prom/node-exporter:v1.6.1
          container_name: node-exporter
          restart: always
          ports:
            - "9100:9100"
          volumes:
            - /proc:/host/proc:ro
            - /sys:/host/sys:ro
            - /:/rootfs:ro
          command:
            - '--path.procfs=/host/proc'
            - '--path.sysfs=/host/sys'
            - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
          user: root
          networks:
            - prom-net
      
        grafana:
          image: grafana/grafana:10.2.2
          container_name: grafana
          restart: always
          ports:
            - "3000:3000"
          volumes:
            - grafana-data:/var/lib/grafana
          networks:
            - prom-net
      
      volumes:
        prometheus-data:
        grafana-data:
      
      networks:
        prom-net:
          driver: bridge
      
    • Prometheus 配置(prometheus.yml,抓取 cAdvisor 与 Node Exporter):
      global:
        scrape_interval: 15s
        evaluation_interval: 15s
      
      scrape_configs:
        - job_name: 'cadvisor'
          static_configs:
            - targets: ['cadvisor:8080']
      
        - job_name: 'node-exporter'
          static_configs:
            - targets: ['node-exporter:9100']
      
    • 启动
      cd /opt/prometheus-docker
      docker compose up -d
      
    • 验证
      • Prometheus:访问 http://<服务器IP>:9090,Targets 页面应看到 cadvisor:8080node-exporter:9100UP
      • cAdvisor:访问 http://<服务器IP>:8080/metrics,能看到容器指标。
      • Grafana:访问 http://<服务器IP>:3000,默认账号 admin/admin,添加 Prometheus 数据源 http://prometheus:9090 并导入容器/主机仪表盘。

三 告警规则与通知

  • Prometheus 告警规则(rules.yml,挂载到 Prometheus 容器内,如 /etc/prometheus/rules.yml)
    groups:
    - name: container.rules
      rules:
      - alert: HighCPUUsage
        expr: sum(rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (name) > 0.8
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "容器 {{ $labels.name }} CPU使用率过高"
          description: "当前使用率: {{ $value | humanizePercentage }}"
    
      - alert: MemoryNearLimit
        expr: container_memory_usage_bytes{name!=""} / container_spec_memory_limit_bytes{name!=""} > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "容器 {{ $labels.name }} 内存接近上限"
          description: "已用/上限: {{ $value | humanizePercentage }}"
    
      - alert: InstanceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "实例 {{ $labels.instance }} 已下线"
    
    • 在 prometheus.yml 中引入规则:
      rule_files:
        - /etc/prometheus/rules.yml
      
  • Alertmanager 通知示例(alertmanager.yml,支持邮件/Slack/企业微信/钉钉 Webhook)
    • 邮件
      global:
        resolve_timeout: 5m
      
      route:
        group_by: ['alertname']
        group_wait: 30s
        group_interval: 5m
        repeat_interval: 1h
        receiver: 'email'
      
      receivers:
      - name: 'email'
        email_configs:
        - to: 'ops@example.com'
          from: 'alert@example.com'
          smarthost: 'smtp.example.com:587'
          auth_username: 'user'
          auth_password: 'pass'
          require_tls: true
      
    • Slack
      receivers:
      - name: 'slack'
        slack_configs:
        - api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
          channel: '#alerts'
      
    • 企业微信(Webhook)
      receivers:
      - name: 'wechat'
        webhook_configs:
        - url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY'
      
    • 钉钉(Webhook)
      receivers:
      - name: 'dingtalk'
        webhook_configs:
        - url: 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
      
    • 部署要点
      • 将 Alertmanager 加入同一 Docker 网络,Prometheus 的 alerting 指向 alertmanager:9093
      • 配置完成后,在 Prometheus UI 的 Alerts 页面查看规则状态,在 Alertmanager UI(http://:9093)查看告警分组与通知路由。

四 验证与运维要点

  • 连通性与数据验证
    • Prometheus Targets:状态应为 UP;cAdvisor 的 /metrics 可返回大量容器指标;Grafana 可正常出图。
  • 日志与排错
    • 查看容器日志:docker logs -f prometheusdocker logs -f alertmanagerdocker logs -f cadvisor
    • 常见原因:端口冲突、挂载目录权限不足、目标地址不可达、网络未互通。
  • 性能与规模
    • 抓取间隔建议 15–30s;单主机监控 100+ 容器建议资源 4C8G 起步;数据持久化使用命名卷(如 prometheus-data、grafana-data)。
  • 安全加固
    • 限制 9090/3000/9093 等端口的访问来源(防火墙/反向代理/内网隔离);为 Grafana 设置强密码与登录策略;邮件/Webhook 凭据妥善保存。

五 可选增强

  • 日志与追踪
    • 日志:使用 Loki + PromtailELK 集中采集容器日志,便于与指标告警联动排查。
    • 应用指标与健康检查:在应用中暴露 /metrics(Prometheus 客户端),并通过 HEALTHCHECK 暴露健康状态,结合告警实现自愈或滚动更新。
  • 动态发现与多主机
    • Prometheus 支持基于文件、DNS、Consul 等的服务发现;在容器编排平台(如 Kubernetes)可使用对应的 SD 配置实现自动发现。

0