2026 Prometheus 自建监控系统:Docker 部署实现服务器全方位监控
你的服务器是不是也经常这样:半夜被报警短信吵醒,登录一看 CPU 100%,却不知道刚才发生了什么?或者想排查性能瓶颈,翻遍系统日志也找不到头绪看 CPU 100%,却不知道刚才发生了什么?或者想排查性能瓶颈,翻遍系统日志也找不到头绪?
Prometheus 就是为了解决这种问题而生的。它是一个用 Go 语言编写的开源监控系统,由 CNCF 孵化,现在已经是云原生监控的事实标准。无论是单台 VPS 还是上千节点的 Kubernetes 集群,Prometheus 都能搞定。
而且 Go 写的服务就是香:单二进制文件、超低内存占用、开箱即用。用 Docker 部署 Prometheus 只需两条命令,在 1 核 2G 的廉价 VPS 上都能跑得飞起。
一、Prometheus 监控体系架构
Prometheus 采用「拉模型」采集监控数据。它定期从被监控的目标(称为 Targets)拉取指标数据,存储在本地时序数据库中。
核心组件
| 组件 | 作用 | Docker 镜像 |
|---|---|---|
| Prometheus Server | 核心引擎,采集和存储指标 | prom/prometheus |
| Node Exporter | 采集服务器硬件和 OS 指标 | prom/node-exporter |
| cAdvisor | 采集容器运行指标(可选) | gcr.io/cadvisor/cadvisor |
| Alertmanager | 告警管理和通知分发 | prom/alertmanager |
| Grafana | 可视化仪表盘(需另部署) | grafana/grafana |
监控指标分类
| 指标类型 | 采集来源 | 示例 |
|---|---|---|
| CPU | Node Exporter | node_cpu_seconds_total |
| 内存 | Node Exporter | node_memory_MemAvailable_bytes |
| 磁盘 | Node Exporter | node_filesystem_avail_bytes |
| 网络 | Node Exporter | node_network_receive_bytes_total |
| 进程 | Node Exporter | node_processes_pids |
| 容器 | cAdvisor | container_cpu_usage_seconds_total |
| 自定义 | 业务代码接入 | 自行定义指标 |
二、Docker Compose 一键部署
这是目前最推荐的部署方式。一个 docker-compose.yml 文件,启动所有组件。
准备工作
# 创建监控专用目录mkdir -p ~/monitoring/prometheus ~/monitoring/grafanacd ~/monitoringdocker-compose.yml
version: '3.8'
services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped ports: - \"9090:9090\" volumes: - ./prometheus:/etc/prometheus - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles'
node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped ports: - \"9100:9100\" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs' - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
volumes: prometheus_data:Prometheus 配置文件
prometheus/prometheus.yml:
global: scrape_interval: 15s evaluation_interval: 15s
scrape_configs: # Prometheus 自身指标 - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']
# 服务器节点指标 - job_name: 'node' static_configs: - targets: ['node-exporter:9100']
# 如需监控其他服务器,在这里添加 # - job_name: 'remote-node' # static_configs: # - targets: ['192.168.1.100:9100', '192.168.1.101:9100']
alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093']
rule_files: - 'alerts.yml'告警规则
prometheus/alerts.yml:
groups: - name: node_alerts rules: - alert: HighCPUUsage expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100) > 80 for: 5m labels: severity: warning annotations: summary: \"CPU 使用率超过 80% ({{ $value }}%)\" description: \"实例 {{ $labels.instance }} CPU 使用率已超过 80% 持续 5 分钟\"
- alert: DiskSpaceLow expr: (node_filesystem_avail_bytes{mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"}) * 100 < 10 for: 5m labels: severity: critical annotations: summary: \"磁盘空间不足 (剩余 {{ $value | humanizePercentage }})\" description: \"实例 {{ $labels.instance }} 根分区剩余空间不足 10%\"
- alert: MemoryHigh expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85 for: 5m labels: severity: warning annotations: summary: \"内存使用率超过 85% ({{ $value }}%)\" description: \"实例 {{ $labels.instance }} 内存使用率已超过 85%\"启动
docker compose up -d访问 http://你的IP:9090,Prometheus Web UI 页面就出来了。在查询框输入 up,如果能看到 1 值的指标,说明采集成功了。
三、Node Exporter 详解
Node Exporter 是 Prometheus 生态中最常用的指标采集器,它暴露了服务器几乎所有的底层指标。
常用 PromQL 查询
| 你想看什么 | PromQL 查询 |
|---|---|
| CPU 使用率 | 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100) |
| 内存使用率 | (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 |
| 磁盘使用率 | (node_filesystem_avail_bytes{mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"}) * 100 |
| 磁盘 IO | rate(node_disk_io_time_seconds_total[5m]) |
| 网络流量 | rate(node_network_receive_bytes_total[5m]) |
| 系统负载 | node_load15 |
| 运行时间 | time() - node_boot_time_seconds |
多服务器监控
要监控多台服务器,只需在每台机器上部署 Node Exporter:
# 在其他服务器上也跑 Node Exporterdocker run -d --name node-exporter \\ --restart unless-stopped \\ --net=\"host\" \\ --pid=\"host\" \\ -v \"/proc:/host/proc:ro\" \\ -v \"/sys:/host/sys:ro\" \\ -v \"/:/rootfs:ro\" \\ prom/node-exporter:latest \\ --path.procfs=/host/proc \\ --path.sysfs=/host/sys \\ --path.rootfs=/rootfs然后在 Prometheus 配置的 scrape_configs 中添加对应 IP:
- job_name: 'remote-nodes' static_configs: - targets: ['192.168.1.10:9100', '192.168.1.11:9100']四、Prometheus vs 其他监控方案
| 对比项 | Prometheus | Netdata | Zabbix | Uptime Kuma |
|---|---|---|---|---|
| 语言 | Go ✅ | C | C++ | Node.js |
| 部署复杂度 | 中等 | 简单 | 复杂 | 很简单 |
| 资源占用 | ~200MB | ~100MB | ~500MB+ | ~50MB |
| 告警能力 | 强(Alertmanager) | 强 | 很强 | 一般 |
| 历史数据存储 | 本地 TSDB | 存多久设多久 | 数据库 | 有限 |
| 多节点支持 | ⭐ 原生分布式 | 主从 | 原生 | 单机为主 |
| 自定义指标 | ✅ 完善 | ❌ 仅预设 | ✅ | ❌ |
| 社区生态 | CNCF 顶级项目 | 活跃 | 老牌稳定 | 较新 |
| Docker 镜像大小 | ~100MB | ~30MB | ~200MB | ~20MB |
选型建议: 单台服务器看状态用 Uptime Kuma 就够了;要深入分析性能用 Netdata;生产环境多服务器监控首选 Prometheus——它的数据模型和查询语言是业界标准,Grafana 上的仪表盘模板多到用不完。
五、常见问题 FAQ
Q1:Prometheus 会占用多少磁盘空间?
取决于采集频率和保留时间。按默认 scrape_interval: 15s、retention.time: 15d 计算,单台服务器的指标数据大约占用 2-5GB。你可以调整 retention.time 来节省空间。
Q2:为什么查询 up 指标返回空?
最可能的原因:
- Prometheus 配置里的
targets地址不对——Docker 内要用容器名,跨主机用 IP - Node Exporter 没启动——检查
docker ps - 防火墙没开端口——需要放行
9090和9100
Q3:1 核 2G 的 VPS 跑得动吗?
完全没问题。 Prometheus 本身只占 ~200MB 内存,Node Exporter 不到 20MB。在 1 核 2G 的廉价 VPS 上同时跑 Prometheus + Grafana + 几个 Web 服务都毫无压力。
Q4:如何用 Grafana 展示 Prometheus 数据?
先部署 Grafana(下一篇文章会详细讲),然后在 Grafana 中:
- 添加数据源 → 选择 Prometheus
- URL 填
http://prometheus:9090(Docker 内网通信) - Save & Test
- 导入仪表盘模板(推荐 ID
1860的 Node Exporter Full 模板)
Q5:告警通知怎么配置?
在 Alertmanager 配置文件中添加接收器:
receivers: - name: 'webhook' webhook_configs: - url: 'https://your-bot-url/webhook'支持邮件、钉钉、Slack、Webhook、PagerDuty 等多种通知方式。
Q6:Prometheus 和 InfluxDB 有什么区别?
| 对比项 | Prometheus | InfluxDB |
|---|---|---|
| 数据模型 | Metric + Label | Measurement + Tag |
| 查询语言 | PromQL(强项) | Flux/InfluxQL |
| 拉/推模式 | 拉模型 | 推模型 |
| 高可用 | Thanos/Cortex 扩展 | 原生集群 |
| 适用场景 | 监控告警 | 物联网/APM |
简单说:做监控告警选 Prometheus,做应用性能分析选 InfluxDB。
Prometheus 的部署只是第一步。有了指标数据,下一篇文章我们会部署 Grafana,把那些冷冰冰的数字变成赏心悦目的仪表盘,再配合 Loki 做日志分析——这三个组合在一起,才是完整的可观测体系。”
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!