方案概述

  1. 使用 Docker 启动 Prometheus
  2. 使用 Docker 启动 Grafana
  3. 在需要监控的服务器上安装 Node Exporter
  4. 配置 Prometheus 定时拉取 Node Exporter 的数据
  5. 在 Grafana 中创建 Dashboard 展示监控数据

一、使用 Docker 启动 Prometheus

安装 Docker 参考:Ubuntu 20.04 从官方源安装最新的 Docker。
使用 docker compose 来配置和启动:

# 目录为 /opt/prometheus
mkdir -vp /opt/prometheus

# 创建数据目录并设置权限
mkdir -vp /opt/prometheus/data
chown -R 65534:65534 /opt/prometheus/data
chmod -R 755 /opt/prometheus/data

# 创建 docker-compose.yml 文件
cd /opt/prometheus
nano docker-compose.ymlCopy

docker-compose.yml 内容:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v3
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./data:/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --storage.tsdb.retention.time=180d
      - --storage.tsdb.retention.size=50GB
      - --web.enable-lifecycleCopy

参数说明:数据保留180天/50GB,启用生命周期重载。接着创建 prometheus.yml:

关于参数:
  • --config.file=/etc/prometheus/prometheus.yml:指定 Prometheus 的配置文件路径,同时搭配 volumes 将本地的 prometheus.yml 文件挂载到容器中并设置为只读,确保配置文件的安全性。
  • --storage.tsdb.path=/prometheus:指定 Prometheus 存储数据的路径,这里将容器内的 /prometheus 目录挂载到主机的 ./data 目录,确保数据持久化。
  • --storage.tsdb.retention.time=180d:数据保留时间为 180 天。
  • --storage.tsdb.retention.size=50GB:数据保留大小为 50GB。
  • --web.enable-lifecycle:启用 Prometheus 的生命周期管理接口,允许在运行时重新加载配置文件。
在启动前,还需要创建 prometheus.yml 配置文件:
cd /opt/prometheus
nano prometheus.ymlCopyglobal:
  global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        - 'localhost:9090'Copy
这里的配置定义了全局抓取间隔、超时时间和评估间隔。
并且还配置了一个抓取 Prometheus 自身指标的 job,目标是 localhost:9090。
接着启动:
docker compose up -dCopy
访问 http://<服务器IP>:9090,如果看到 Prometheus 的界面,说明 Prometheus 已经成功启动了。
也可以直接curl来测试
curl http://localhost:9090/metricsCopy

二、使用 Docker 启动 Grafana

同样使用 docker compose 来配置和启动 Grafana
# 目录为 /opt/grafana
mkdir -vp /opt/grafana
cd /opt/grafana

# 创建数据目录并设置权限
mkdir -vp /opt/grafana/data
chown -R 472:472 /opt/grafana/data
chmod -R 755 /opt/grafana/data

# 创建 docker-compose.yml 文件
nano docker-compose.ymlCopy
version: '3.8'

services:
  grafana:
    image: grafana/grafana:12.4
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - /opt/grafana/data:/var/lib/grafana
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: change-this-password
      GF_USERS_ALLOW_SIGN_UP: "false"
      GF_AUTH_ANONYMOUS_ENABLED: "false"
      GF_SERVER_DOMAIN: grafana.example.com
      GF_SERVER_ROOT_URL: https://grafana.example.comCopy
参数都是比较常规的,主要是设置了管理员账号和密码,并且禁用了用户注册和匿名访问。
启动 Grafana
docker compose up -dCopy
访问 http://<服务器IP>:3000,使用之前设置的管理员账号登录。
也可以直接 curl 来测试:
curl http://localhost:3000/api/healthCopy

三、在需要监控的服务器上安装 Node Exporter

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz
tar -xzf node_exporter-1.10.2.linux-amd64.tar.gz
cp node_exporter-1.10.2.linux-amd64/node_exporter /usr/local/bin/
chmod 0755 /usr/local/bin/node_exporterCopy
由于我的 Node Exporter 接口将直接暴露在公网,所以需要添加认证信息。
这些步骤都是可选的,首先生成密码:
htpasswd -nBC 12 "自定义用户名" | tr -d ':\n'Copy
这会生成一个 bcrypt 加密的密码字符串,使用它配置 /etc/node_exporter/web-config.yml 文件:
mkdir -vp /etc/node_exporter
nano /etc/node_exporter/web-config.ymlCopy
basic_auth_users:
  admin: $2y$12$yEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCopy
然后创建 systemd 服务文件来管理 Node Exporter
nano /etc/systemd/system/node_exporter.serviceCopy
[Unit]
Description=Prometheus Node Exporter
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address=0.0.0.0:9100 \
  # 配置了认证后需要添加以下参数
  --web.config.file=/etc/node_exporter/web-config.yml

Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.targetCopy
保存后,重新加载 systemd 配置并启动服务:
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporterCopy
验证 Node Exporter 是否正常运行:
curl http://localhost:9100/metricsCopy
如果配置了认证,需要使用 curl 的 -u 参数来提供用户名和密码(原始密码,不是 bcrypt 加密后的字符串):
curl -u admin:yourpassword http://localhost:9100/metricsCopy
记得开启服务器的防火墙和安全组,放行 9100 端口,以便 Prometheus 能够访问 Node Exporter 的指标数据。
✅ 验证:curl -u admin:yourpassword http://localhost:9100/metrics,记得开放防火墙9100端口。

四、配置 Prometheus 定时拉取 Node Exporter 的数据

编辑 Prometheus 的配置文件 prometheus.yml,在 scrape_configs: 下添加 Node Exporter 的抓取配置:
nano /opt/prometheus/prometheus.ymlCopy
- job_name: 'node_exporter'  
  basic_auth:
    username: admin
    password: yourpassword
  static_configs:
    - targets:
        # 获取Docker网桥IP地址ip addr show docker0 /粘贴时请把这行删除
      - 'your-node-exporter-server-ip:9100'Copy
这里需要注意,认证方式会绑定这个 job 内的所有目标,因此需要尽量避免不同 Node Exporter 密码不同的情况,也不要混用不同的认证方式,否则就需要配置多个 job 来抓取不同的 Node Exporter,会比较麻烦。
然后重新加载 Prometheus 的配置:
curl -X POST http://localhost:9090/-/reloadCopy
查看下拉取的指标数据:
curl http://localhost:9090/api/v1/targetsCopy
如果看到 node_exporter 的目标状态为 UP,说明 Prometheus 已经成功拉取了 Node Exporter 的数据。

五、在 Grafana 中创建 Dashboard 展示监控数据

首先在 Connections > Data Sources 中添加 Prometheus 数据源,URL 填写 http://<Prometheus 服务器 IP>:9090 (如果 Grafana 和 Prometheus 在同一内网使用内网IP),保存并测试连接。
然后在 Dashboards 页面的右上角,选择引入一个现成的 Node Exporter 的 Dashboard 模板:
输入模板 ID 1860 或者输入 URL https://grafana.com/grafana/dashboards/1860-node-exporter-full/ 进行导入。
📊 最终 Dashboard 展示效果图(CPU/内存/磁盘/网络详尽指标)
Grafana预览示意图

* 实际效果更丰富,此图仅为示意

结束语

至此,基于 Prometheus + Grafana + Node Exporter 的服务器监控平台已搭建完成。通过导入社区成熟仪表盘(1860)可快速获得专业监控视图,并支持灵活扩展其他 exporter。相比传统 Zabbix 更轻量且适配云原生生态。