873 字
4 分钟
Docker Compose 编排 Prometheus 监控栈

1. 目标#

通过 Dockerfile 构建四个监控组件镜像,再用 Docker Compose 一键编排成监控栈:

容器镜像端口作用
monitor-nodemonitor-exporter.09100采集节点指标
monitor-alertmanagermonitor-alert.09093 / 9094告警分发
monitor-grafanamonitor-grafana.03000可视化大盘
monitor-prometheusmonitor-prometheus.09090时序数据库与拉取调度

所需软件包:Monitor.tar.gz(含各组件二进制 tar 包与基础镜像)。

2. 准备工作#

Terminal window
$ tar -zxvf Monitor.tar.gz
$ cd Monitor
$ docker load -i CentOS_7.9.2009.tar # 导入基础镜像

3. 构建 Node-Exporter 镜像#

Dockerfile-exporter

FROM centos:centos7.9.2009
ADD node_exporter-0.18.1.linux-amd64.tar.gz node_exporter.sh /opt/
RUN chmod +x /opt/node_exporter.sh
EXPOSE 9100
CMD ["/bin/bash","/opt/node_exporter.sh"]

node_exporter.sh

#!/bin/bash
cd /opt/node_exporter-0.18.1.linux-amd64
./node_exporter

构建:

Terminal window
$ docker build -t monitor-exporter:v1.0 -f Dockerfile-exporter .

4. 构建 Alertmanager 镜像#

4.1 修改配置#

修改 alertmanager/alertmanager.yml,配置邮件告警通道(按需替换为真实邮箱):

global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:465'
smtp_from: 'alert@example.com'
smtp_auth_username: 'alert@example.com'
smtp_auth_password: '<授权码>'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']

抑制规则配置中 equal 字段如果原模板里有 dev,需要删除——它对应额外的标签维度,缺失该标签时会导致规则不生效。

4.2 Dockerfile-alert#

FROM centos:centos7.9.2009
ADD alertmanager-0.19.0.linux-amd64.tar.gz alert.sh /opt/
ADD alertmanager/alertmanager.yml /opt/alertmanager-0.19.0.linux-amd64
RUN chmod +x /opt/alert.sh
EXPOSE 9093 9094
CMD ["/bin/bash","/opt/alert.sh"]

alert.sh

#!/bin/bash
cd /opt/alertmanager-0.19.0.linux-amd64
./alertmanager --config.file="alertmanager.yml"

构建:

Terminal window
$ docker build -t monitor-alert:v1.0 -f Dockerfile-alert .

5. 构建 Grafana 镜像#

Dockerfile-grafana

FROM centos:centos7.9.2009
ADD grafana-6.4.1.linux-amd64.tar.gz grafana.sh /opt/
RUN chmod +x /opt/grafana.sh
EXPOSE 3000
CMD ["/bin/bash","/opt/grafana.sh"]

grafana.sh

#!/bin/bash
cd /opt/grafana-6.4.1/bin
./grafana-server

构建:

Terminal window
$ docker build -t monitor-grafana:v1.0 -f Dockerfile-grafana .

6. 构建 Prometheus 镜像#

6.1 准备 prometheus.yml#

global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- 172.129.20.57:9093 # 替换为本机 IP
rule_files:
- /opt/alert-rules.yml
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['172.129.20.57:9090']
labels:
instance: 'prometheus'
- job_name: 'node'
static_configs:
- targets: ['172.129.20.57:9100']
labels:
instance: 'node-exporter'
- job_name: 'alertmanager'
static_configs:
- targets: ['172.129.20.57:9093']
labels:
instance: 'alertmanager'

6.2 Dockerfile-prometheus#

FROM centos:centos7.9.2009
ADD prometheus-2.13.0.linux-amd64.tar.gz alert-rules.yml prometheus.sh /opt/
RUN mkdir -p /data/prometheus
COPY prometheus.yml /data/prometheus
RUN chmod +x /opt/prometheus.sh
EXPOSE 9090
CMD ["/bin/bash","/opt/prometheus.sh"]

prometheus.sh

#!/bin/bash
cd /opt/prometheus-2.13.0.linux-amd64
./prometheus --config.file="/data/prometheus/prometheus.yml"

构建:

Terminal window
$ docker build -t monitor-prometheus:v1.0 -f Dockerfile-prometheus .

7. docker-compose.yaml 编排#

version: "3"
services:
monitor-node:
container_name: monitor-node
image: monitor-exporter:v1.0
ports:
- 9100:9100
restart: always
monitor-alertmanager:
container_name: monitor-alert
image: monitor-alert:v1.0
depends_on:
- monitor-node
ports:
- 9093:9093
- 9094:9094
restart: always
monitor-grafana:
container_name: monitor-grafana
image: monitor-grafana:v1.0
depends_on:
- monitor-node
- monitor-alertmanager
ports:
- 3000:3000
restart: always
monitor-prometheus:
container_name: monitor-prometheus
image: monitor-prometheus:v1.0
depends_on:
- monitor-node
- monitor-alertmanager
- monitor-grafana
ports:
- 9090:9090
restart: always

启动:

Terminal window
$ docker-compose up -d
$ docker-compose ps -a

全部 StateUp 即部署成功。

8. 验证与配置数据源#

  1. 浏览器访问 http://<节点IP>:9090,Prometheus Web UI。在 Status → Targets 中确认三个 job 状态为 UP
  2. 浏览器访问 http://<节点IP>:3000,Grafana 登录页。默认账号密码均为 admin,首次登录提示修改密码。
  3. 添加数据源:Configuration → Data Sources → Add data source → Prometheus
    • URL:http://172.129.20.57:9090(用本机 IP,不要用 localhost,容器内 localhost 指容器自身)
    • 名称:Prometheus
    • 点击 Save & Test,出现 ✓ Data source is working 即成功。
  4. 之后可导入 Grafana 官方仪表盘(如 ID 1860 Node Exporter Full)。

9. 常见问题#

现象排查点
docker-compose ps 状态不是 Updocker-compose logs <服务名> 看具体报错
Prometheus Target Down网络不通或目标端口未监听,检查容器日志和端口映射
Grafana 添加数据源失败URL 写成 localhost;改成宿主机 IP 或服务名 monitor-prometheus
Alertmanager 不发邮件SMTP 配置错误,授权码非密码;查容器日志
Prometheus 报告 alert-rules.yml 不存在Dockerfile 中 ADD 是否包含规则文件

10. 小结#

  • 监控栈分层很清晰:采集(Exporter)→ 存储与告警(Prometheus + Alertmanager)→ 展示(Grafana)
  • Compose 编排时用 depends_on 控制启动顺序,但它不等待服务真正就绪,必要时需要业务侧重试
  • 数据源 URL 容易踩坑:容器内的 localhost 不是宿主机,要么用宿主机 IP,要么用 Compose 服务名
  • 真实场景建议把配置文件、数据目录都通过 volumes 挂载出来,避免重建容器丢数据
Docker Compose 编排 Prometheus 监控栈
https://blog.xeu.asia/posts/docker-compose-monitor-stack/
作者
Xeu
发布于
2026-05-21
许可协议
CC BY-NC-SA 4.0