Docker 命令搭建 Prometheus + Grafana

和 Zabbix 类似,这套系统也是三个核心组件:

组件

作用

类比

Prometheus

采集和存储监控数据(时序数据库)

Zabbix Server

Grafana

可视化展示数据(漂亮的图表面板)

Zabbix Web

Node Exporter

采集服务器自身指标(CPU、内存等)

Zabbix Agent

📋 准备工作

确保 Docker 已安装,然后创建专用网络:

 # 创建一个网络,让三个容器能互相通信
 docker network create monitor-net

第一步:启动 Node Exporter(采集服务器指标)

 # docker run = 创建并启动容器
 # -d = 后台运行
 # --name node-exporter = 容器名字
 # --network monitor-net = 加入监控网络
 # --restart unless-stopped = 意外退出时自动重启
 #
 # -p 9100:9100 = 端口映射:宿主机 9100 映射到容器 9100
 #   9100 是 Node Exporter 的默认端口,Prometheus 会从这里拉取数据
 #
 # prom/node-exporter:latest = 镜像名
 #   --path.rootfs=/host = 让 Node Exporter 读取宿主机的系统信息
 #   -v /:/host:ro = 挂载宿主机的根目录到容器内的 /host(只读)
 #   这样 Node Exporter 就能采集 CPU、内存、磁盘等系统指标了
 docker run -d \
   --name node-exporter \
   --network monitor-net \
   --restart unless-stopped \
   -p 9100:9100 \
   -v /:/host:ro \
   prom/node-exporter:latest \
   --path.rootfs=/host
 ​
 # 验证是否启动成功
 docker ps | grep node-exporter
 ​
 # 测试 Node Exporter 是否正常工作
 # 浏览器访问 http://你的服务器IP:9100/metrics
 # 如果看到一堆数据,说明正常


第二步:启动 Prometheus(核心服务)

Prometheus 需要一份配置文件来告诉它"去哪里采集数据"。我们先创建配置文件。

2.1 创建 Prometheus 配置文件

 # 创建存放配置文件的目录
 mkdir -p ~/prometheus
 ​
 # 用 cat 命令创建配置文件(EOF 表示多行文本)
 cat > ~/prometheus/prometheus.yml << 'EOF'
 # 全局配置
 global:
   scrape_interval: 15s     # 每 15 秒采集一次数据
   evaluation_interval: 15s # 每 15 秒评估一次告警规则
 ​
 # 采集目标配置
 scrape_configs:
   # 第一个采集任务:监控 Prometheus 自身
   - job_name: 'prometheus'
     static_configs:
       - targets: ['localhost:9090']
 ​
   # 第二个采集任务:监控 Node Exporter(服务器指标)
   - job_name: 'node-exporter'
     static_configs:
       # 注意:这里用的是容器名 node-exporter,因为它们在同一个网络里
       - targets: ['node-exporter:9100']
 EOF
 ​
 # 查看配置文件内容
 cat ~/prometheus/prometheus.yml

2.2 启动 Prometheus 容器

 # --name prometheus = 容器名字
 # --network monitor-net = 加入监控网络
 # -p 9090:9090 = 映射 9090 端口(Prometheus 的 Web UI)
 #
 # -v ~/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
 #   把宿主机上的配置文件挂载到容器内,这样修改配置不用重建容器
 #
 # -v prometheus-data:/prometheus
 #   创建一个数据卷,用来持久化存储监控数据(容器删了数据还在)
 #
 # prom/prometheus:latest = 镜像名
 #   --config.file=/etc/prometheus/prometheus.yml = 指定配置文件位置
 #   --storage.tsdb.path=/prometheus = 指定数据存储位置
 #   --web.enable-lifecycle = 允许通过 HTTP API 热加载配置(不用重启)
 docker run -d \
   --name prometheus \
   --network monitor-net \
   --restart unless-stopped \
   -p 9090:9090 \
   -v ~/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
   -v prometheus-data:/prometheus \
   prom/prometheus:latest \
   --config.file=/etc/prometheus/prometheus.yml \
   --storage.tsdb.path=/prometheus \
   --web.enable-lifecycle
 ​
 # 验证启动
 docker ps | grep prometheus
 ​
 # 查看日志,确认没有报错
 docker logs prometheus
 ​
 # 测试 Prometheus
 # 浏览器访问 http://你的服务器IP:9090
 # 点击 Status -> Targets,如果看到 node-exporter 状态为 UP,说明采集成功

第三步:启动 Grafana(可视化面板)

 # --name grafana = 容器名字
 # --network monitor-net = 加入监控网络
 # -p 3000:3000 = 映射 3000 端口(Grafana 的 Web 界面)
 #
 # -v grafana-data:/var/lib/grafana
 #   挂载数据卷,保存 Grafana 的配置、面板、数据源等
 #
 # grafana/grafana:latest = 镜像名
 docker run -d \
   --name grafana \
   --network monitor-net \
   --restart unless-stopped \
   -p 3000:3000 \
   -v grafana-data:/var/lib/grafana \
   grafana/grafana:latest
 ​
 # 验证启动
 docker ps | grep grafana
 ​
 # 查看日志
 docker logs grafana

第四步:配置 Grafana 连接 Prometheus

4.1 登录 Grafana

  1. 打开浏览器,访问:

     http://你的服务器IP:3000
  2. 首次登录:

    • 用户名:admin

    • 密码:admin

  3. 修改密码(可选):系统会提示你修改密码,也可以跳过。

4.2 添加 Prometheus 数据源

  1. 登录后,点击左侧菜单的 齿轮图标 ⚙️(Configuration)→ Data Sources

  2. 点击 Add data source 按钮

  3. 选择 Prometheus(第一个就是)

  4. 配置数据源:

    • Name:Prometheus(可以自己取名)

    • URL:http://prometheus:9090

      注意:这里用的是容器名 prometheus,因为 Grafana 和 Prometheus 在同一个 monitor-net 网络里

    • 其他选项保持默认

  5. 点击底部的 Save & Test 按钮

    • 如果看到绿色提示 "Data source is working",说明配置成功!

4.3 导入一个现成的 Dashboard(仪表盘)需要科学上网

Grafana 官网有很多现成的模板可以直接用:

  1. 点击左侧菜单的 + → Import

  2. 在 Import via grafana.com 输入框里输入模板 ID:

    • Node Exporter 监控模板:输入 1860

    • 或者 Linux 系统监控模板:输入 8919

  3. 点击 Load

  4. 在 Prometheus 下拉框里选择你刚添加的数据源(Prometheus)

  5. 点击 Import

  6. 成功!你会看到服务器的 CPU、内存、磁盘、网络等监控图表 🎉

第五步(可选):监控 Docker 容器自身

如果想监控 Docker 容器的运行状态(CPU、内存使用率等),可以加一个 cAdvisor 容器:

 # cAdvisor = Container Advisor,专门采集容器指标
 docker run -d \
   --name cadvisor \
   --network monitor-net \
   --restart unless-stopped \
   -p 8080:8080 \
   -v /:/rootfs:ro \
   -v /var/run:/var/run:ro \
   -v /sys:/sys:ro \
   -v /var/lib/docker/:/var/lib/docker:ro \
   -v /dev/disk/:/dev/disk:ro \
   gcr.io/cadvisor/cadvisor:latest
 ​
 # 然后修改 Prometheus 配置文件,添加 cAdvisor 的采集目标
 # 在 ~/prometheus/prometheus.yml 的 scrape_configs 里添加:
 ​
 #   - job_name: 'cadvisor'
 #     static_configs:
 #       - targets: ['cadvisor:8080']
 ​
 # 修改后,热加载配置(不用重启容器):
 # curl -X POST http://localhost:9090/-/reload

📊 最终架构图

                    浏览器
                     │
                     ▼ (访问 3000 端口)
             ┌───────────────┐
             │    Grafana    │  ← 可视化展示
             │  (端口 3000)  │
             └───────┬───────┘
                     │ 查询数据
                     ▼ (访问 prometheus:9090)
             ┌───────────────┐
             │   Prometheus  │  ← 存储 + 查询
             │  (端口 9090)  │
             └───────┬───────┘
                     │ 拉取指标 (Pull)
         ┌───────────┼───────────┐
         ▼           ▼           ▼
 ┌─────────────┐ ┌──────────┐ ┌──────────┐
 │node-exporter│ │ cAdvisor │ │  其他... │
 │ (端口 9100) │ │(端口8080)│ │         │
 └─────────────┘ └──────────┘ └──────────┘
    采集系统指标    采集容器指标

🧹 常用管理命令

 # 查看所有监控容器
 docker ps | grep -E "prometheus|grafana|node-exporter|cadvisor"
 ​
 # 查看容器日志
 docker logs prometheus
 docker logs grafana
 ​
 # 重启容器
 docker restart prometheus
 ​
 # 停止容器
 docker stop prometheus grafana node-exporter
 ​
 # 删除容器(谨慎操作)
 docker rm -f prometheus grafana node-exporter cadvisor
 ​
 # 查看 Prometheus 采集目标状态
 # 浏览器访问 http://你的IP:9090/targets
 ​
 # 在 Prometheus 里查询数据(测试用)
 # 浏览器访问 http://你的IP:9090/graph
 # 输入 node_cpu_seconds_total 然后点击 Execute

✅ 检查清单

步骤

验证方法

预期结果

Node Exporter 启动

docker ps | grep node

容器状态 Up

Prometheus 启动

访问 http://IP:9090/targets

node-exporter 状态为 UP

Grafana 启动

访问 http://IP:3000

看到 Grafana 登录页面

数据源配置

Grafana → Data Sources → Test

显示 "Data source is working"

导入 Dashboard

导入 ID 1860

看到服务器监控图表

💡 与 Zabbix 对比

对比项

Zabbix

Prometheus + Grafana

安装复杂度

中等(需要数据库+Server+Web)

较简单(三个容器)

数据存储

MySQL/PostgreSQL

自带的 TSDB(时序数据库)

可视化

自带 Web 界面(较传统)

Grafana(更现代、更漂亮)

告警配置

界面配置,较直观

需要写规则文件(较复杂)

适用场景

传统 IT 基础设施

云原生、Kubernetes、微服务