☰
Prometheus+Grafana监控系统Docker部署指南
2026/11/5 8:22:01 网站建设 项目流程
## 1. 项目概述 在运维监控领域,Prometheus+Grafana的组合已成为事实上的标准方案。这次我在AlmaLinux 8系统上通过Docker容器化部署这套监控系统,主要解决以下问题: - 传统监控方案(如Zabbix)配置复杂、资源占用高 - 需要轻量级但功能完整的监控体系,支持Linux/Windows混合环境 - 实现快速部署和灵活扩展,适应测试环境和生产环境的不同需求 整套方案包含三个核心组件: 1. **Node-Exporter**:运行在被监控主机上的轻量级数据采集器(仅15MB内存) 2. **Prometheus**:时序数据库和告警引擎(单实例可处理10万级指标) 3. **Grafana**:数据可视化平台(支持300+官方仪表盘模板) 实测在2核4G的虚拟机即可流畅运行整套系统,监控20+主机时CPU占用率低于5%。 ## 2. 环境准备与规划 ### 2.1 硬件配置建议 | 角色 | CPU | 内存 | 磁盘 | 网络 | |-----------------|------|------|--------|--------| | 监控服务器 | 2核+ | 4G+ | 100GB+ | 千兆 | | 被监控节点 | 1核 | 512MB| 10GB | 百兆 | ### 2.2 软件版本选择 ```bash # 版本验证命令 docker run --rm prom/prometheus:v2.47.0 --version docker run --rm grafana/grafana:10.1.5 --version docker run --rm prom/node-exporter:v1.6.1 --version

选择版本时的经验原则:

  1. 生产环境:选择次新版(如Prometheus v2.47而非最新v3.0)
  2. 开发测试:可用最新版体验新特性
  3. Exporter:需与Grafana模板版本匹配(如node-exporter v1.6.1兼容1860模板)

2.3 网络拓扑设计

graph TD A[Prometheus Server] -->|pull| B[Node-Exporter:9100] A -->|pull| C[Windows-Exporter:9182] D[Grafana:3000] -->|query| A

关键配置要点:

  • 确保9100/9090/3000端口可访问
  • 跨主机监控需配置防火墙规则:
    firewall-cmd --permanent --add-port=9100/tcp firewall-cmd --reload

3. 详细部署流程

3.1 存储配置优化

# XFS文件系统优化(适合时序数据库) mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 /dev/sdb1 echo "/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0" >> /etc/fstab # 目录权限设置(关键!) mkdir -p /data/prometheus/{data,conf} chown -R 65534:65534 /data/prometheus # Prometheus容器用户

3.2 Docker Compose配置详解

version: '3.8' services: prometheus: image: prom/prometheus:v2.47.0 deploy: resources: limits: memory: 2G volumes: - /data/prometheus/data:/prometheus - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=30d' # 数据保留30天 grafana: image: grafana/grafana:10.1.5 environment: - GF_SECURITY_ADMIN_PASSWORD=StrongPassword123! - GF_USERS_ALLOW_SIGN_UP=false volumes: - /data/grafana:/var/lib/grafana

3.3 Node-Exporter最佳实践

docker run -d \ --name node-exporter \ --net=host \ --pid=host \ -v "/:/host:ro,rslave" \ prom/node-exporter:v1.6.1 \ --path.rootfs=/host \ --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($$|/)" \ --collector.textfile.directory=/host/var/lib/node-exporter

关键参数说明:

  • --net=host:直接使用主机网络,避免NAT性能损耗
  • rslave:递归挂载,确保所有子挂载点可见
  • 忽略系统目录减少无用指标采集

4. 监控模板配置技巧

4.1 导入模板的注意事项

  1. 通过Grafana的"+" > "Import"输入模板ID
  2. 选择正确的Prometheus数据源
  3. 检查变量替换:
    { "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" } ] }

4.2 模板适配修改

当出现数据缺失时,按以下步骤排查:

  1. 在Prometheus的Graph页面查询原始指标
    node_memory_MemFree_bytes{instance="$node"}
  2. 对比模板中的查询语句
  3. 常见修改点:
    • 替换指标名(如node_memory_MemFree→node_memory_free_bytes)
    • 调整标签匹配(job="node-exporter"→job="nodes")

5. 常见问题解决方案

5.1 数据采集异常排查

# 检查exporter是否正常提供指标 curl -s http://localhost:9100/metrics | head # 验证Prometheus抓取配置 docker exec -it prometheus promtool check config /etc/prometheus/prometheus.yml # 查看抓取目标状态 http://prometheus-server:9090/targets

5.2 Grafana面板无数据

典型原因及解决:

  1. 时间范围不匹配:

    • 检查面板右上角时间范围选择
    • 尝试设置为"Last 15 minutes"
  2. 变量未生效:

    { "datasource": "${DS_PROMETHEUS}", "expr": "node_cpu_seconds_total{instance=~\"$hosts\"}" }
  3. 指标名称变更:

    • 在Prometheus的Graph页面验证指标是否存在
    • 使用{__name__=~"node_.*"}模糊查询

6. 生产环境优化建议

6.1 性能调优参数

# prometheus.yml 关键配置 global: scrape_interval: 30s # 根据负载调整 evaluation_interval: 30s alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093'] rule_files: - '/etc/prometheus/rules/*.yml' storage: tsdb: retention: 15d # 缩短保留期降低磁盘压力

6.2 高可用方案

graph TD A[Prometheus A] -->|远程写入| C[VictoriaMetrics] B[Prometheus B] -->|远程写入| C D[Grafana] --> C

实现步骤:

  1. 部署VictoriaMetrics集群
  2. 配置Prometheus远程写入:
    remote_write: - url: http://victoriametrics:8428/api/v1/write
  3. Grafana连接VictoriaMetrics作为数据源

7. 监控项扩展方法

7.1 自定义指标采集

通过textfile收集器添加自定义指标:

# 创建指标文件 echo 'node_custom_metric 42' > /var/lib/node-exporter/custom.prom # 设置定时任务更新指标 */5 * * * * echo "node_custom_metric $(date +%s)" > /var/lib/node-exporter/custom.prom

7.2 Blackbox监控

监控HTTP/ICMP/TCP服务:

# prometheus.yml 新增配置 scrape_configs: - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - http://example.com relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115

8. 安全加固措施

8.1 访问控制实现

# Nginx反向代理配置示例 location /grafana/ { proxy_pass http://localhost:3000/; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; } location /prometheus/ { proxy_pass http://localhost:9090/; allow 192.168.1.0/24; deny all; }

8.2 数据加密方案

  1. 启用HTTPS:
    docker run -v /path/to/certs:/etc/grafana/certs grafana/grafana \ --config=/etc/grafana/grafana.ini \ --cert-file=/etc/grafana/certs/server.crt \ --key-file=/etc/grafana/certs/server.key
  2. 配置Prometheus TLS:
    tls_config: cert_file: /path/to/client.crt key_file: /path/to/client.key

9. 维护与升级策略

9.1 数据备份方案

# Prometheus���据备份脚本 #!/bin/bash BACKUP_DIR=/backup/prometheus-$(date +%Y%m%d) mkdir -p $BACKUP_DIR docker exec prometheus tar czf - /prometheus > $BACKUP_DIR/data.tar.gz cp /opt/prometheus-grafana/prometheus.yml $BACKUP_DIR/

9.2 版本升级步骤

  1. 停止旧容器:
    docker compose stop prometheus
  2. 备份配置和数据
  3. 修改docker-compose.yml中的镜像版本
  4. 启动新容器:
    docker compose up -d prometheus
  5. 验证指标采集:
    curl -s http://localhost:9090/-/healthy

10. 典型监控场景示例

10.1 主机资源告警规则

groups: - name: host.rules rules: - alert: HighCPUUsage expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 10m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}" description: "CPU usage is {{ $value }}%" - alert: MemoryPressure expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20 for: 15m labels: severity: critical

10.2 业务级监控看板

# Grafana变量定义 - name: service query: label_values(my_app_http_requests_total, service) refresh: OnDashboardLoad # 关键业务指标查询 sum(rate(my_app_http_requests_total{service="$service",status=~"2.."}[5m])) by (endpoint) / sum(rate(my_app_http_requests_total{service="$service"}[5m])) by (endpoint)

11. 性能监控数据解读

11.1 CPU监控要点

# CPU使用率计算公式 100 - ( avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 ) # CPU负载告警规则 node_load5 / on(instance) count by(instance)(node_cpu_seconds_total{mode="system"}) > 1.5

11.2 内存分析技巧

# 内存使用率(含缓存) (node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100 # SWAP使用告警 node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes > 1024^3 * 1 # 超过1GB使用

12. 扩展监控能力

12.1 容器监控集成

# 添加cAdvisor监控 - job_name: 'docker' static_configs: - targets: ['cadvisor:8080'] metric_relabel_configs: - source_labels: [container_label_com_docker_swarm_service_name] target_label: service # 典型容器指标 container_cpu_usage_seconds_total{name="nginx"} container_memory_working_set_bytes{image!=""}

12.2 日志监控联动

通过Loki实现:

# promtail配置示例 scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*log # Grafana添加Loki数据源

13. 最终部署验证

13.1 健康检查清单

# 检查服务端口 ss -tulnp | grep -E '9090|3000|9100' # 验证数据采集 curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.health=="up")' # 检查Grafana数据源 curl -u admin:password http://localhost:3000/api/datasources -H "Content-Type: application/json"

13.2 性能基准测试

# Prometheus查询压力测试 docker run --rm -it --network host quay.io/prometheus/prometheus \ promtool tsdb bench write --metrics=10000 --out=bench.out # Grafana压力测试 docker run --rm -v $(pwd):/var/loadtest \ -e LOAD_TEST_URL=http://grafana:3000 \ -e LOAD_TEST_USERS=10 \ grafana/k6 run /var/loadtest/script.js

经过完整部署和验证,这套监控系统已经可以稳定运行。在实际使用中,建议定期(每周)检查存储空间和告警规则有效性,根据业务增长适时扩展资源。对于关键业务指标,可以设置更精细的告警阈值和升级机制。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询