1. 项目概述
在现代化监控体系中,Prometheus 全家桶(包含 Prometheus、Alertmanager、Grafana 等组件)已成为云原生监控的事实标准。本次我们将通过 Docker Compose 实现整套系统的快速部署,并完成告警规则的配置与集成。这种部署方式特别适合中小型团队快速搭建监控平台,也便于开发人员在本地环境进行测试验证。
整套方案采用容器化部署,具有以下核心优势:
- 环境隔离:各组件运行在独立容器中,避免依赖冲突
- 一键启停:通过 compose 文件管理整个监控栈的生命周期
- 配置即代码:所有配置(包括告警规则)都可以版本化管理
- 资源可控:可以方便地调整各组件资源配额
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与部署架构
2.1 基础环境要求
部署前需要确保:
- Docker 版本 ≥ 20.10.7
- Docker Compose 版本 ≥ v2.1.1
- 系统资源建议:
- CPU: 4核以上
- 内存: 8GB以上
- 磁盘: 50GB以上(根据监控数据保留周期调整)
提示:可以通过
docker compose version检查版本,如果报错 "unknown command" 说明使用的是旧版 compose,需要安装 V2 版本。
2.2 部署架构设计
我们采用以下组件组合:
code复制Prometheus(数据采集+存储)
├─ Alertmanager(告警管理)
├─ Grafana(可视化)
└─ Blackbox Exporter(黑盒监控)
网络拓扑采用 bridge 网络模式,各服务通过服务名互相访问。数据存储采用 volume 持久化,确保容器重启后数据不丢失。
3. Docker Compose 文件详解
3.1 完整 compose 配置
创建 docker-compose.yml 文件:
yaml复制version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./alerts:/etc/prometheus/alerts
- prom_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
restart: unless-stopped
blackbox:
image: prom/blackbox-exporter:latest
container_name: blackbox
ports:
- "9115:9115"
volumes:
- ./blackbox.yml:/etc/blackbox_exporter/config.yml
restart: unless-stopped
volumes:
prom_data:
grafana_data:
3.2 关键配置解析
-
Prometheus 参数:
--storage.tsdb.retention.time=30d:设置数据保留30天- 挂载了 alerts 目录用于存放告警规则文件
-
Grafana 环境变量:
GF_SECURITY_ADMIN_PASSWORD:设置初始管理员密码
-
网络配置:
- 各服务通过服务名(如
prometheus:9090)互相访问 - 对外暴露端口:
- Prometheus: 9090
- Grafana: 3000
- Alertmanager: 9093
- 各服务通过服务名(如
4. Prometheus 核心配置
4.1 主配置文件 (prometheus.yml)
yaml复制global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- '/etc/prometheus/alerts/*.rules'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['host.docker.internal:9100']
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://example.com
- http://google.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox:9115
4.2 配置要点说明
-
监控目标配置:
- 使用
host.docker.internal访问宿主机上的 exporter - Blackbox 配置了 HTTP 探活示例
- 使用
-
告警集成:
- 通过
alerting部分关联 Alertmanager rule_files指向告警规则目录
- 通过
-
relabel_configs:
- 对 Blackbox 的指标进行重标记
- 确保实例标签显示被检测的URL
5. 告警规则配置实战
5.1 创建告警规则文件
在 alerts 目录下创建 system.rules:
yaml复制groups:
- name: system
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is {{ $value }}%"
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Service {{ $labels.job }} on {{ $labels.instance }} is down"
5.2 告警规则最佳实践
-
表达式编写技巧:
- 使用
irate而不是rate处理计数器指标 - 通过
avg by进行维度聚合
- 使用
-
标签设计原则:
severity标签用于分级(warning/critical)- 确保每个告警都有有意义的 summary
-
阈值设置建议:
- CPU: 80% (warning), 90% (critical)
- 内存: 90% (warning), 95% (critical)
- 磁盘: 85% (warning), 90% (critical)
6. Alertmanager 配置详解
6.1 基础配置 (alertmanager.yml)
yaml复制route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'email-notifications'
receivers:
- name: 'email-notifications'
email_configs:
- to: 'alerts@yourdomain.com'
from: 'alertmanager@yourdomain.com'
smarthost: 'smtp.yourdomain.com:587'
auth_username: 'user'
auth_password: 'password'
require_tls: true
templates:
- '/etc/alertmanager/templates/*.tmpl'
6.2 告警路由进阶配置
- 多级路由示例:
yaml复制route:
receiver: 'default-receiver'
group_by: [alertname, cluster]
routes:
- match:
severity: 'critical'
receiver: 'critical-alerts'
- match_re:
service: ^(foo1|foo2|baz)$
receiver: 'team-abc'
- 抑制规则配置:
yaml复制inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname']
7. Grafana 集成与告警配置
7.1 数据源配置
- 登录 Grafana (http://localhost:3000)
- 添加 Prometheus 数据源:
- URL: http://prometheus:9090
- 开启 "Default" 选项
7.2 告警面板创建
- 创建新 Dashboard
- 添加 Graph 面板
- 设置告警:
- 在 "Alert" 选项卡定义条件
- 配置通知渠道(需提前设置)
7.3 告警通知渠道设置
- 进入 "Alerting" → "Notification channels"
- 添加邮件通知示例:
json复制{
"type": "email",
"settings": {
"addresses": "alerts@yourdomain.com",
"singleEmail": true
}
}
8. 常见问题排查指南
8.1 部署问题
问题1:docker: unknown command: docker compose
- 解决方案:安装 compose V2 插件
bash复制mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
问题2:Prometheus 无法抓取宿主机指标
- 检查点:
- 宿主机是否运行 node_exporter
- 在 compose 中正确配置
extra_hosts或使用host.docker.internal
8.2 告警不触发
排查步骤:
- 检查 Prometheus 规则是否加载:
- 访问 http://localhost:9090/rules
- 验证表达式:
- 在 Prometheus Graph 页面测试告警表达式
- 检查 Alertmanager 日志:
bash复制
docker logs alertmanager
8.3 Grafana 告警不通知
检查清单:
- 通知渠道是否验证通过
- 告警规则是否设置了正确的标签(匹配路由)
- Grafana 是否配置了正确的 SMTP 设置
9. 生产环境优化建议
9.1 性能调优
- Prometheus 参数优化:
yaml复制command:
- '--storage.tsdb.retention.time=30d'
- '--storage.tsdb.wal-compression'
- '--storage.tsdb.max-block-duration=2h'
- '--storage.tsdb.min-block-duration=2h'
- 资源限制:
yaml复制deploy:
resources:
limits:
cpus: '2'
memory: 4G
9.2 高可用方案
-
Prometheus 双活部署:
- 两个实例配置相同的抓取任务
- 使用相同的告警规则
-
Alertmanager 集群:
yaml复制command:
- '--cluster.peer=alertmanager2:9094'
9.3 监控数据长期存储
- 远程存储集成:
yaml复制remote_write:
- url: "http://thanos:10908/api/v1/receive"
- 定期备份方案:
bash复制docker exec prometheus tar czf /backup/prometheus-$(date +%s).tar.gz /prometheus
这套部署方案已经过生产环境验证,可以支撑日均百万级指标的监控需求。根据实际业务规模,可以灵活调整 Prometheus 的抓取间隔和保留时间。建议初次部署后,先在小规模环境运行观察资源占用情况,再逐步扩大监控范围。
