873 字
4 分钟
Docker Compose 编排 Prometheus 监控栈
1. 目标
通过 Dockerfile 构建四个监控组件镜像,再用 Docker Compose 一键编排成监控栈:
| 容器 | 镜像 | 端口 | 作用 |
|---|---|---|---|
| monitor-node | monitor-exporter | 9100 | 采集节点指标 |
| monitor-alertmanager | monitor-alert | 9093 / 9094 | 告警分发 |
| monitor-grafana | monitor-grafana | 3000 | 可视化大盘 |
| monitor-prometheus | monitor-prometheus | 9090 | 时序数据库与拉取调度 |
所需软件包:Monitor.tar.gz(含各组件二进制 tar 包与基础镜像)。
2. 准备工作
$ tar -zxvf Monitor.tar.gz$ cd Monitor$ docker load -i CentOS_7.9.2009.tar # 导入基础镜像3. 构建 Node-Exporter 镜像
Dockerfile-exporter
FROM centos:centos7.9.2009ADD node_exporter-0.18.1.linux-amd64.tar.gz node_exporter.sh /opt/RUN chmod +x /opt/node_exporter.shEXPOSE 9100CMD ["/bin/bash","/opt/node_exporter.sh"]node_exporter.sh
#!/bin/bashcd /opt/node_exporter-0.18.1.linux-amd64./node_exporter构建:
$ 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.2009ADD alertmanager-0.19.0.linux-amd64.tar.gz alert.sh /opt/ADD alertmanager/alertmanager.yml /opt/alertmanager-0.19.0.linux-amd64RUN chmod +x /opt/alert.shEXPOSE 9093 9094CMD ["/bin/bash","/opt/alert.sh"]alert.sh
#!/bin/bashcd /opt/alertmanager-0.19.0.linux-amd64./alertmanager --config.file="alertmanager.yml"构建:
$ docker build -t monitor-alert:v1.0 -f Dockerfile-alert .5. 构建 Grafana 镜像
Dockerfile-grafana
FROM centos:centos7.9.2009ADD grafana-6.4.1.linux-amd64.tar.gz grafana.sh /opt/RUN chmod +x /opt/grafana.shEXPOSE 3000CMD ["/bin/bash","/opt/grafana.sh"]grafana.sh
#!/bin/bashcd /opt/grafana-6.4.1/bin./grafana-server构建:
$ 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.2009ADD prometheus-2.13.0.linux-amd64.tar.gz alert-rules.yml prometheus.sh /opt/RUN mkdir -p /data/prometheusCOPY prometheus.yml /data/prometheusRUN chmod +x /opt/prometheus.shEXPOSE 9090CMD ["/bin/bash","/opt/prometheus.sh"]prometheus.sh
#!/bin/bashcd /opt/prometheus-2.13.0.linux-amd64./prometheus --config.file="/data/prometheus/prometheus.yml"构建:
$ 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启动:
$ docker-compose up -d$ docker-compose ps -a全部 State 为 Up 即部署成功。
8. 验证与配置数据源
- 浏览器访问
http://<节点IP>:9090,Prometheus Web UI。在 Status → Targets 中确认三个 job 状态为UP。 - 浏览器访问
http://<节点IP>:3000,Grafana 登录页。默认账号密码均为admin,首次登录提示修改密码。 - 添加数据源:Configuration → Data Sources → Add data source → Prometheus
- URL:
http://172.129.20.57:9090(用本机 IP,不要用 localhost,容器内 localhost 指容器自身) - 名称:
Prometheus - 点击 Save & Test,出现 ✓
Data source is working即成功。
- URL:
- 之后可导入 Grafana 官方仪表盘(如 ID
1860Node Exporter Full)。
9. 常见问题
| 现象 | 排查点 |
|---|---|
docker-compose ps 状态不是 Up | docker-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/