用 Prometheus + Grafana 搭建服务器监控

用 Docker Compose 在你的服务器上快速起一套 Prometheus 拉取指标、Grafana 出图的监控栈,并用 node_exporter 采集主机指标。

当你在自己的服务器或 VPS 上跑业务时,「这台机器现在负载多少、内存还剩多少、磁盘会不会满」是每天都要回答的问题。Prometheus + Grafana 是目前最主流的开源答案:Prometheus 负责按固定间隔拉取(pull)并存储时序指标,Grafana 负责把这些指标画成可视化面板。本文以 Ubuntu/Debian + Docker 为例,带你从零跑通。

架构一分钟看懂

  • Prometheus:核心是一个时序数据库 + 抓取器。它按 prometheus.yml 里配置的目标列表,周期性地对每个目标的 /metrics 端点发起 HTTP 请求,把返回的指标存下来。注意是 Prometheus 主动来拉,不是目标往外推。
  • Exporter(如 nodeexporter):被监控对象通常不会自己说 Prometheus 的语言,于是用一个 exporter 把主机的 CPU、内存、磁盘、网络等指标翻译成 /metrics 文本格式。nodeexporter 专门采集主机层指标。
  • Grafana:把 Prometheus 当作数据源,用 PromQL 查询并渲染成图表、仪表盘、告警。

数据流向:nodeexporter → (被 Prometheus 拉取) → Prometheus 存储 → Grafana 查询出图。

用 Docker Compose 起 Prometheus + Grafana

先确保装了 Docker 与 Compose 插件:

sudo apt update && sudo apt install -y docker.io docker-compose-plugin

新建一个目录,写 docker-compose.yml:

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prom_data:/prometheus
    ports:
      - "9090:9090"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=change-me-please
    volumes:
      - grafana_data:/var/lib/grafana
    restart: unless-stopped

  node_exporter:
    image: prom/node-exporter:latest
    pid: host
    ports:
      - "9100:9100"
    restart: unless-stopped

volumes:
  prom_data:
  grafana_data:

配置抓取目标 prometheus.yml

在同目录建 prometheus.yml,告诉 Prometheus 去拉谁:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: node
    static_configs:
      - targets: ["node_exporter:9100"]

nodeexporter:9100 用的是 Compose 服务名,容器间靠内部 DNS 互通,不必写 IP。改完拉起:

docker compose up -d

加数据源与导入 Dashboard

  • 浏览器打开 http://你的服务器IP:3000,用户名 admin、密码为上面设置的值登录。
  • 左侧 Connections → Data sources → Add data source → Prometheus,URL 填 http://prometheus:9090(同一 Compose 网络内用服务名),保存并 Save & test。
  • 导入现成面板:Dashboards → New → Import,填入社区面板 ID 1860(Node Exporter Full),选择刚建的 Prometheus 数据源,即可得到一整套主机监控图。

想验证 Prometheus 自身是否抓到数据,可访问 http://你的服务器IP:9090/targets,看每个 target 是否为 UP。

几个实用提醒

  • 别把端口裸露公网:9090/3000/9100 建议只在内网或用防火墙、反向代理加认证后开放。
  • 生产环境记得给容器镜像钉住版本号(别一直用 latest),避免某天自动更新引入不兼容。
  • 数据卷 promdata、grafanadata 已持久化,重启不丢历史与面板。

小结

Prometheus 负责拉取和存储、Grafana 负责出图,是一套解耦清晰、社区面板丰富的监控组合。用 Docker Compose 三个服务、两个配置文件就能在你的服务器上跑通:prometheus.yml 声明抓取目标,nodeexporter 采集主机指标,Grafana 加数据源后导入 ID 1860 的面板即可开箱观察 CPU、内存、磁盘、网络。跑通之后,再逐步加告警规则、给端口收口鉴权,就是一套可长期使用的自建监控。