基于 Docker-Compose 部署 Prometheus 监控系统(普罗米修斯)

Source

一、项目概述:从零搭建监控平台

1.1 为什么选择 Prometheus?

Prometheus 是云原生时代的监控标准,相比 Zabbix 等传统工具,它具备:

  • 多维数据模型(标签体系)
  • 强大的 PromQL 查询语言
  • Pull 模型(主动拉取指标,易于扩展)
  • 完美的容器化支持

1.2 架构解析

本文将部署以下核心组件:

组件 作用 端口
Node-Exporter 采集主机硬件/OS 指标 9100
Prometheus 时序数据库 & 抓取引擎 9090
Alertmanager 告警分发与管理 9093
Grafana 数据可视化仪表盘 3000

二、环境准备与镜像导入

由于实验环境或者竞赛环境通常无外网,我们使用离线 Tar 包导入基础镜像。

2.1 解压资源包

tar -zxvf Monitor.tar.gz
cd Monitor

2.2 导入 CentOS 基础镜像

docker load -i /root/Monitor/CentOS_7.9.2009.tar

解释:docker load 将打包好的 CentOS 7.9 镜像加载到本地 Docker 仓库,作为后续所有服务的底座。

三、构建 Node-Exporter 镜像(数据采集层)

目标:部署 monitor-exporter:v1.0,用于采集 Linux 服务器的 CPU、内存、磁盘等指标。

3.1 编写 Dockerfile(Node-Exporter)

FROM centos:centos7.9.2009

# 解压二进制包(ADD 会自动解压 tar.gz)
ADD node_exporter-0.18.1.linux-amd64.tar.gz .

# 移动二进制文件到系统 PATH 中
RUN cp node_exporter-*/node_exporter /usr/local/bin/

EXPOSE 9100
# 直接前台运行,无需 systemd
CMD ["node_exporter"]

3.2 构建镜像

docker build -f Dockerfile-Monitor -t monitor-exporter:v1.0 .

解释:Node-Exporter 是一个无状态的 Go 二进制程序,直接运行即可暴露 /metrics 接口。

四、构建 Alertmanager 镜像(告警层)

目标:部署 monitor-alert:v1.0,用于处理 Prometheus 产生的告警并发送给邮箱/钉钉。

4.1 编写 Dockerfile(Alertmanager)

FROM centos:centos7.9.2009

ADD alertmanager-0.19.0.linux-amd64.tar.gz .

# 安装二进制文件
RUN cp alertmanager-*/alertmanager /usr/local/bin/

# 创建配置文件目录
RUN mkdir /etc/alertmanager

# 拷贝默认配置
RUN cp alertmanager-*/alertmanager.yml /etc/alertmanager/

EXPOSE 9093 9094
CMD ["alertmanager","--config.file=/etc/alertmanager/alertmanager.yml"]

4.2 构建镜像

docker build -t monitor-alert:v1.0 -f Dockerfile-Alertmanager .

解释:9093 是 Web UI 端口,9094 是集群通信端口。Alertmanager 负责“去重、分组、路由”告警。

五、构建 Grafana 镜像(展示层)

目标:部署 monitor-grafana:v1.0,提供炫酷的监控仪表盘。

5.1 编写 Dockerfile(Grafana)

FROM centos:centos7.9.2009

# 创建安装目录
RUN mkdir /opt/grafana

# 解压 Grafana
ADD grafana-6.4.1.linux-amd64.tar.gz /opt/grafana

EXPOSE 3000
# 指定家目录启动
CMD ["/opt/grafana/grafana-6.4.1/bin/grafana-server","-homepath","/opt/grafana/grafana-6.4.1"]

5.2 构建镜像

docker build -t monitor-grafana:v1.0 -f Dockerfile-Grafana .

解释:Grafana 本身不存数据,只做展示,数据源指向 Prometheus。

六、构建 Prometheus Server 镜像(核心层)

目标:部署 monitor-prometheus:v1.0,这是整个系统的大脑。

6.1 配置 prometheus.yml
在启动前,必须告诉 Prometheus 去哪里抓数据。

vi prometheus.yml
scrape_configs:
  # Job 1: 监控 Prometheus 自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090'] 
  
  # Job 2: 监控 Node 节点
  - job_name: 'node'
    static_configs:
      - targets: ['monitor-node:9100']  
  
  # Job 3: 监控 Alertmanager
  - job_name: 'alertmanager'
    static_configs:
      - targets: ['monitor-alertmanager:9093']

关键点:这里的 monitor-node和 monitor-alertmanager是 Docker-Compose 的服务名,Docker 内置 DNS 会自动解析。

6.2 编写 Dockerfile(Prometheus)

FROM centos:centos7.9.2009

ADD prometheus-2.13.0.linux-amd64.tar.gz .

# 安装二进制
RUN cp prometheus-*/prometheus /usr/local/bin/

# 创建数据目录(存放 TSDB 数据)
RUN mkdir -p /data/prometheus

# 拷贝配置文件
COPY prometheus.yml /data/prometheus/

EXPOSE 9090
CMD ["prometheus", "--config.file=/data/prometheus/prometheus.yml"]

6.3 构建镜像

docker build -t monitor-prometheus:v1.0 -f Dockerfile-promethues .

七、Docker-Compose 编排部署

7.1 编写 docker-compose.yaml

将所有组件通过桥接网络连接起来。

version: "3"

services:
  # 1. 节点采集器
  monitor-node:
    image: monitor-exporter:v1.0
    container_name: monitor-node
    ports:
      - "9100:9100"
    networks:
      - monitoring
    restart: unless-stopped

  # 2. 告警管理器
  monitor-alertmanager:
    image: monitor-alert:v1.0
    container_name: monitor-alertmanager
    ports:
      - "9093:9093"
      - "9094:9094"
    networks:
      - monitoring
    restart: unless-stopped

  # 3. Grafana 可视化
  monitor-grafana:
    image: monitor-grafana:v1.0
    container_name: monitor-grafana
    ports:
      - "3000:3000"
    depends_on:
      - monitor-prometheus
    networks:
      - monitoring
    restart: unless-stopped
    # 建议补充:Grafana 数据持久化(防止仪表盘丢失)
    volumes:
      - grafana_data:/var/lib/grafana

  # 4. Prometheus 核心
  monitor-prometheus:
    image: monitor-prometheus:v1.0
    container_name: monitor-prometheus
    ports:
      - "9090:9090"
    depends_on:
      - monitor-node
      - monitor-alertmanager
    networks:
      - monitoring
    restart: unless-stopped
    # Prometheus 数据持久化(核心修正点)
    volumes:
      - prometheus_data:/data/prometheus

# ================= 持久化卷定义 =================
volumes:
  prometheus_data:
  grafana_data:

# ================= 自定义网络 =================
networks:
  monitoring:
    driver: bridge

如果是为了竞赛可达到题目给分点即可,不用太完善。

八、启动与验证

8.1 启动服务

docker-compose up -d

8.2 检查状态

docker-compose ps

8.3 访问验证

服务 地址 说明
Prometheus http://IP:9090 查看 Targets 是否 UP
Grafana http://IP:3000 默认 admin/admin
Node-Exporter http://IP:9100 查看原始指标

九、总结与避坑指南

9.1 核心技术点

  • 离线构建:使用 docker load + 本地 RPM 包解决无网环境。
  • 服务发现:利用 Docker-Compose 的服务名作为 DNS 进行动态寻址。
  • 分层解耦:采集、存储、展示、告警四层分离。

9.2 常见错误

  1. Targets 显示 DOWN:检查防火墙是否放行端口,或 Compose 网络是否正常。
  2. Grafana 无数据:检查 Prometheus 数据源地址是否填 http://monitor-prometheus:9090。
  3. 权限问题:如果在生产环境,记得给 /data/prometheus挂载卷,防止容器删除数据丢失。