使用docker部署prometheus监控指南

目录结构规划

├── alertmanager                    # 告警
│   └── alertmanager.yml
├── blackbox                        # 黑盒探测
│   └── config.yml
├── docker-compose.yml              # docker部署文件
├── grafana                         # 可视化grafana
└── prometheus                      
  ├── alert.yml                   # 配置告警规则
  └── prometheus.yml              # 配置监控指标
   
mkdir -p /apps/monitor/{prometheus,alertmanager,grafana,blackbox}
cd /apps/monitor

Prometheus配置

vim prometheus/prometheus.yml
global:
scrape_interval: 30s                    # 全局抓取间隔,每30秒采集一次数据
 
rule_files:
 - "alert.yml"                           # 引用同目录下的告警规则文件,作用:定义告警规则(如CPU使用率过高、服务不可用等)
​
alerting:                                 # 作用:配置Prometheus将告警发送到哪个Alertmanager
alertmanagers:
   - static_configs:
     - targets: ["10.0.0.18:9093"]       # Alertmanager服务地址
​
scrape_configs:
 - job_name: "prometheus"                # 作用:监控Prometheus的运行状态和性能
  static_configs:
     - targets: ["10.0.0.18:9090"]
 
 - job_name: "node"                      # 作用:收集主机的系统指标(CPU、内存、磁盘等)
  static_configs:
     - targets: ["10.0.0.18:9100"]
​
 - job_name: "docker"                    # 作用:收集容器的性能指标
  static_configs:
     - targets: ["10.0.0.18:8088"]       # cAdvisor指标
  metric_relabel_configs:
     - source_labels: [container]        # 从container标签中提取
      target_label: name                # 映射到name标签
​
 # 常规HTTP探测
 - job_name: "blackbox-http"             # 黑盒监控
  metrics_path: /probe                  # 使用probe接口
  params:
    module: [http_2xx]                  # 使用http探测模块
  static_configs:
     - targets:
       - https://www.baidu.com           # 监控百度
       - http://10.0.0.18:8088           # 监控cAdvisor服务
       - http://10.0.0.18:9090           # 监控Prometheus自身
       - http://10.0.0.18:3000           # 监控Grafana
  relabel_configs:
     - source_labels: [__address__]      # 原始地址
      target_label: __param_target      # 作为target参数传给blackbox
     - target_label: __address__         # 重写目标地址
      replacement: 10.0.0.18:9115       # 改为blackbox exporter的地址
     - source_labels: [__param_target]   # 将原始目标地址
      target_label: instance            # 保存为instance标签
     - target_label: module
      replacement: http_2xx
​
 # 慢响应服务探测(使用更长的超时)
 - job_name: "blackbox-slow"
  metrics_path: /probe
  params:
    module: [http_2xx_slow]  # 使用慢速探测模块
  scrape_interval: 60s  # 降低探测频率
  static_configs:
     - targets:
       - http://10.0.0.18:8080  # 假设有个慢服务
  relabel_configs:
     - source_labels: [__address__]
      target_label: __param_target
     - target_label: __address__
      replacement: 10.0.0.18:9115
     - source_labels: [__param_target]
      target_label: instance
​
 # HTTPS服务探测(验证SSL证书)
 - job_name: "blackbox-https"
  metrics_path: /probe
  params:
    module: [https_2xx]  # 使用HTTPS探测模块
  static_configs:
     - targets:
       - https://your-secure-site.com
       - https://api.example.com
  relabel_configs:
     - source_labels: [__address__]
      target_label: __param_target
     - target_label: __address__
      replacement: 10.0.0.18:9115
     - source_labels: [__param_target]
      target_label: instance

告警规则配置

vim prometheus/alert.yml 
groups:
- name: system
interval: 30s
rules:
 
 - alert: CPU使用率过高
  expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
   for: 5m
  labels:
    severity: warning
     service: system
  annotations:
    summary: "{{ $labels.instance }} CPU使用率过高"
    description: "CPU使用率已达{{ $value | printf \"%.2f\" }}%,持续超过5分钟"
 
 - alert: CPU可用率不足
  expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
   for: 2m
  labels:
    severity: critical
     service: system
  annotations:
    summary: "{{ $labels.instance }} CPU使用率严重过高"
    description: "CPU使用率已达{{ $value | printf \"%.2f\" }}%,可能影响服务响应"
 
 - alert: 内存即将不足
  expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20
   for: 5m
  labels:
    severity: warning
     service: system
  annotations:
    summary: "{{ $labels.instance }} 内存不足"
    description: "可用内存仅剩{{ $value | printf \"%.2f\" }}%,请检查内存使用情况"
 
 - alert: 内存不足
  expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
   for: 2m
  labels:
    severity: critical
     service: system
  annotations:
    summary: "{{ $labels.instance }} 内存严重不足"
    description: "可用内存仅剩{{ $value | printf \"%.2f\" }}%,系统可能OOM"
 
 - alert: 主机宕机
  expr: up == 0
   for: 1m
  labels:
    severity: critical
     service: system
  annotations:
    summary: "{{ $labels.instance }} 主机宕机"
    description: "实例 {{ $labels.instance }} ({{ $labels.job }}) 已离线超过1分钟"
​
- name: blackbox_alerts
rules:
 # HTTP服务不可用告警
 - alert: HTTPServiceDown
  expr: probe_success == 0
   for: 1m
  labels:
    severity: critical
     service: external
  annotations:
    summary: "{{ $labels.instance }} 服务不可用"
    description: "服务 {{ $labels.instance }} 已无法访问超过1分钟"
​
 # HTTP响应慢告警
 - alert: HTTPSlowResponse
  expr: probe_duration_seconds > 2
   for: 5m
  labels:
    severity: warning
     service: external
  annotations:
    summary: "{{ $labels.instance }} 响应缓慢"
    description: "服务响应时间已达 {{ $value }}s,超过2s阈值"
​
 # SSL证书即将过期告警
 - alert: SSLCertExpiringSoon
  expr: probe_ssl_earliest_cert_expiry - time() < 604800  # 7天
   for: 10m
  labels:
    severity: warning
     service: ssl
  annotations:
    summary: "{{ $labels.instance }} SSL证书即将过期"
    description: "证书将在 {{ $value | humanizeDuration }} 后过期"
​
 # SSL证书已过期告警
 - alert: SSLCertExpired
  expr: probe_ssl_earliest_cert_expiry - time() < 0
   for: 1m
  labels:
    severity: critical
     service: ssl
  annotations:
    summary: "{{ $labels.instance }} SSL证书已过期"
    description: "证书已过期,请立即更新"
​
 # HTTP状态码异常告警
 - alert: HTTPStatusCodeError
  expr: probe_http_status_code <= 199 or probe_http_status_code >= 400
   for: 1m
  labels:
    severity: warning
     service: external
  annotations:
    summary: "{{ $labels.instance }} 返回异常状态码"
    description: "服务返回HTTP状态码: {{ $labels.probe_http_status_code }}"

Alertmanager配置

vim alertmanager/alertmanager.yml 
# route:
# receiver: "default"             # 所有告警都发送给名为"default"的接收器
#
# receivers:
# - name: "default"               # 定义了一个名为"default"的接收器
#
global:
resolve_timeout: 1m
smtp_from: "1659271013@qq.com"
smtp_smarthost: "smtp.qq.com:465"
smtp_auth_username: "1659271013@qq.com"
smtp_auth_password: "Zhou251418@0517"
smtp_require_tls: false
smtp_hello: "qq.com"
​
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 2m
repeat_interval: 1h
receiver: 'wechat' #默认接收者修改为wechat
receivers:
 - name: email-receiver
  email_configs:
   - send_resolved: true
    to: 1659271013@qq.com
 - name: 'dingtalk-webhook'
  webhook_configs:
     - url: 'http://192.168.122.22:8060/dingtalk/webhook1/send'
 #添加微信接受者
 - name: "wechat"
  wechat_configs:
   - send_resolved: true
    api_secret: JKVtu6ZQ6FlA-xxpeD65AJ6_qdnbJyTEPF9HPjXQevg #上面在企业微信创建应用之后获取的Secret
    corp_id: ww3a85cb45631b015f #企业微信公司id,可以在企业微信管理后台获得
    agent_id: 1000003 #上面在企业微信创建应用之后获取的AgentId
     # to_user: '@all' #如果需要发送给指定用户可以使用to_user,@all表示所有人
    to_party: 1 #发送给指定的部门,2代表部门ID,部门ID可以在企业微信管理后台获得
inhibit_rules:
 - source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']

Blackbox配置

vim blackbox/config.yml 
modules:
http_2xx:             # 基础HTTP探测模块。用途:监控常规Web服务,接受常见的成功/重定向状态码
  prober: http        # 使用http探测器
  timeout: 3s         # 测超时时间3秒
  http:
    valid_http_versions: ["HTTP/1.1", "HTTP/2"]   # 支持的HTTP版本
    valid_status_codes: [200, 301, 302]           # 接受的状态码
    method: GET                                   # HTTP方法
    follow_redirects: true                        # 允许重定向
    preferred_ip_protocol: "ip4"                  # 优先使用IPv4
​
http_2xx_slow:        # 慢速HTTP探测模块。用途:监控响应较慢的服务(如复杂API、数据库查询界面等)
  prober: http
  timeout: 10s
  http:
    valid_status_codes: [200]
​
https_2xx:            # HTTPS探测模块。用途:监控HTTPS服务,同时验证SSL证书有效性
  prober: http
  timeout: 5s
  http:
    valid_status_codes: [200]
    tls_config:
      insecure_skip_verify: false     # 验证SSL证书

编写docker-compose.yml文件

vim docker-compose.yml 
version: "3.8"
​
services:
prometheus:                                      # 作用:从各个exporter收集指标数据,存储时序数据
  image: prom/prometheus
  container_name: prometheus
  volumes:
     - ./prometheus:/etc/prometheus               # 挂载本地配置目录
     - /var/run/docker.sock:/var/run/docker.sock  # 用于发现Docker容器
  ports:
     - 9090:9090
   restart: always
​
node-exporter:                                   # 作用:收集Linux主机的系统指标(CPU、内存、磁盘、网络等)
  image: prom/node-exporter
  container_name: node-exporter
   restart: always
  ports:
     - 9100:9100
​
cadvisor:                                        # 作用:收集容器的资源使用情况和性能指标
  image: gcr.m.daocloud.io/cadvisor/cadvisor     # DaoCloud镜像加速
  container_name: cadvisor
  privileged: true                               # 需要特权模式访问系统信息
  ports:
     - 8088:8080                                  # 映射到主机的8088端口
  devices:                                       # 内核日志设备
     - /dev/kmsg
  volumes:
     - /:/rootfs:ro                               # 根文件系统
     - /var/run:/var/run:ro                       # 运行时数据
     - /sys:/sys:ro                               # 系统信息
     - /var/lib/docker:/var/lib/docker:ro         # Docker数据
   restart: always
​
alertmanager:                                    # 作用:处理Prometheus发出的告警,进行去重、分组、路由
  image: prom/alertmanager
  container_name: alertmanager
  volumes:
     - ./alertmanager:/etc/alertmanager
  ports:
     - 9093:9093
   restart: always
​
grafana:                                         # 作用:提供美观的监控数据可视化仪表板
  image: grafana/grafana
  container_name: grafana
  ports:
     - 3000:3000
   restart: always
​
blackbox:                                       # 作用:通过HTTP/HTTPS/DNS/ICMP等方式探测服务可用性
  image: prom/blackbox-exporter
  container_name: blackbox
  volumes:
     - ./blackbox:/etc/blackbox_exporter
  ports:
     - 9115:9115
   restart: always

【温馨提示】上述配置根据生产实际需求进行调整

构建容器,启动服务

docker-compose up -d
​
# 查看容器
docker ps
​
# 进入检查容器
docker exec -it [容器名] bash

访问地址

组件地址
Prometheushttp://服务器IP:9090
Grafanahttp://服务器IP:3000
Alertmanagerhttp://服务器IP:9093
cadvisorhttp://服务器IP:8088
# Grafana默认用户及密码
用户:admin
密码:admin
​
【温馨提示】首次登入使用其可直接修改密码,若不想修改密码点击skip即可
​
# Grafana 必装仪表盘
导入 ID:
1860 Linux主机
193 Docker
8919 Node Exporter
179 Prometheus
数据源选 Prometheus:http://prometheus:9090