
本文档将手把手指导你,如何利用 Docker Compose 这一利器,将 Prometheus 监控生态的核心组件(包括 Grafana、MySQL、Node Exporter、MySQL Exporter 及 Alertmanager)一键编排部署。实现从主机到数据库的全面指标采集、可视化展示以及告警通知。所有组件容器化运行,既保证了环境的一致性,也极大地简化了部署流程,非常适合测试环境快速搭建,也为生产环境的基础架构提供了可靠的起点(生产部署需额外考虑高可用与数据备份策略)。
部署环境要求为 CentOS 7.x(兼容主流 Linux 发行版),并已安装 Docker 20.10+ 和 Docker Compose 2.0+。
二、环境预处理
2.1 安装 Docker 及 Docker Compose
首先需要安装必要的依赖工具,确保 Docker 服务正常运行,为后续的容器编排打下坚实基础。
# 卸载系统原有旧版 Docker
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装 Docker 依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置 Docker 官方 YUM 源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker CE 版本
yum install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker
# 安装 Docker Compose(二进制方式,适配 Linux x86_64 架构)
curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 验证安装结果
docker --version # 输出 Docker 版本信息即正常
docker-compose --version # 输出 Docker Compose 版本信息即正常
2.2 创建统一部署目录
为了避免配置文件和数据分散各处,我们创建一个统一的目录结构,方便配置持久化和后续维护,同时也能有效避免因容器销毁而导致配置丢失的问题。
# 创建部署根目录
mkdir -p /opt/prometheus-stack
cd /opt/prometheus-stack
# 创建各组件专属目录(配置、数据分离)
mkdir -p prometheus/{config,rules} # Prometheus 主配置及告警规则目录
mkdir -p grafana/data # Grafana 数据持久化目录(面板、用户配置)
mkdir -p alertmanager/config # Alertmanager 告警配置目录
mkdir -p mysql/data # MySQL 数据持久化目录
# 赋予目录读写权限(解决容器内权限不足导致的启动失败问题)
chmod -R 777 /opt/prometheus-stack
2.3 端口规划说明
提前规划好各组件的端口,可以避免潜在的端口冲突。宿主机需要开放以下端口,以便外部访问及组件间通信:
| 组件名称 |
容器内部端口 |
宿主机映射端口 |
用途 |
| Prometheus |
9090 |
9090 |
核心监控服务、UI 访问、指标抓取 |
| Grafana |
3000 |
3000 |
可视化面板访问 |
| MySQL |
3306 |
3306 |
数据库服务访问 |
| Node Exporter |
9100 |
9100 |
宿主机指标采集暴露 |
| MySQL Exporter |
9104 |
9104 |
MySQL 指标采集暴露 |
| Alertmanager |
9093 |
9093 |
告警管理、通知推送 |
提示:如果宿主机上已有服务占用了上述端口,可以在后续的 Docker Compose 配置文件中调整端口映射(格式:宿主机端口:容器端口)。
三、编写 Docker Compose 编排文件
在 /opt/prometheus-stack 目录下创建 docker-compose.yml 文件。这个文件将整合所有组件的容器配置,通过定义依赖关系来控制启动顺序,最终实现一键启停所有服务。
version: '3.8' # 兼容 Docker Compose 2.0+ 版本
services:
# MySQL 服务:提供数据库环境,为 MySQL Exporter 提供采集目标
mysql:
image: mysql:8.0.33 # 选用稳定版镜像,避免版本兼容问题
container_name: mysql
restart: always # 容器异常退出后自动重启
environment:
MYSQL_ROOT_PASSWORD: MySQL@123456 # 根用户密码(建议生产环境修改为强密码)
MYSQL_USER: exporter # 为 MySQL Exporter 创建专用采集用户
MYSQL_PASSWORD: Exporter@123456 # 采集用户密码
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql # 数据持久化,避免容器删除丢失数据
networks:
- prometheus-network # 加入自定义网络,实现组件间隔离通信
command: --default-authentication-plugin=mysql_native_password # 兼容旧版认证,避免 Exporter 连接失败
# Node Exporter:采集宿主机 CPU、内存、磁盘、网络等资源指标
node-exporter:
image: prom/node-exporter:v1.7.0
container_name: node-exporter
restart: always
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro # 只读挂载宿主机 proc 目录,采集系统信息
- /sys:/host/sys:ro # 只读挂载宿主机 sys 目录,采集硬件信息
- /:/rootfs:ro # 只读挂载宿主机根目录,采集磁盘信息
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)' # 忽略无用挂载点,减少指标冗余
networks:
- prometheus-network
# MySQL Exporter:采集 MySQL 连接数、查询量、表空间等指标
mysql-exporter:
image: prom/mysqld-exporter:v0.15.1
container_name: mysql-exporter
restart: always
ports:
- "9104:9104"
environment:
# 配置 MySQL 连接信息,通过容器名实现组件间通信(无需依赖宿主机 IP)
DATA_SOURCE_NAME: "exporter:Exporter@123456@(mysql:3306)/"
depends_on:
- mysql # 依赖 MySQL 服务,确保 MySQL 启动后再启动 Exporter
networks:
- prometheus-network
# Prometheus:核心监控服务,抓取 Exporter 指标、评估告警规则、推送告警至 Alertmanager
prometheus:
image: prom/prometheus:v2.45.3
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- ./prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml # 主配置文件挂载
- ./prometheus/rules/alert_rules.yml:/etc/prometheus/alert_rules.yml # 告警规则文件挂载
- ./prometheus/data:/prometheus # 监控数据持久化
command:
- '--config.file=/etc/prometheus/prometheus.yml' # 指定配置文件路径
- '--storage.tsdb.path=/prometheus' # 指定数据存储路径
- '--web.enable-lifecycle' # 开启配置热加载,无需重启容器即可生效配置
depends_on:
- node-exporter
- mysql-exporter # 依赖两个 Exporter,确保指标源就绪
networks:
- prometheus-network
# Grafana:可视化面板,对接 Prometheus 数据,生成直观监控图表
grafana:
image: grafana/grafana:10.1.2
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- ./grafana/data:/var/lib/grafana # 持久化面板配置、用户信息
environment:
GF_SECURITY_ADMIN_PASSWORD: Grafana@123456 # Grafana 管理员密码(首次登录使用)
GF_USERS_ALLOW_SIGN_UP: "false" # 禁止新用户注册,提升安全性
depends_on:
- prometheus # 依赖 Prometheus,确保数据源就绪
networks:
- prometheus-network
# Alertmanager:接收 Prometheus 告警,通过配置的渠道推送通知(本文以邮件为例)
alertmanager:
image: prom/alertmanager:v0.26.0
container_name: alertmanager
restart: always
ports:
- "9093:9093"
volumes:
- ./alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml # 告警配置挂载
- ./alertmanager/data:/alertmanager # 告警历史数据持久化
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
depends_on:
- prometheus # 依赖 Prometheus,确保告警源就绪
networks:
- prometheus-network
# 自定义桥接网络:实现组件间通信隔离,避免与宿主机其他容器冲突
networks:
prometheus-network:
driver: bridge
四、编写各组件核心配置文件
Docker Compose 文件定义了容器如何运行,我们还需要单独编写各组件的核心功能配置文件。所有配置文件都挂载到宿主机的目录中,方便修改和维护。
4.1 Prometheus 配置文件(prometheus.yml)
这个文件定义了指标抓取规则、关联的告警规则文件以及 Alertmanager 的地址,确保 Prometheus 能正常抓取数据并触发告警。
global:
scrape_interval: 15s # 全局指标抓取间隔,默认 15 秒,可根据需求调整
evaluation_interval: 15s # 告警规则评估间隔,与抓取间隔保持一致即可
# 关联 Alertmanager:指定告警推送目标地址
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093 # 通过容器名通信,无需修改为宿主机 IP
# 关联告警规则文件:指定告警规则存储路径(与 Docker Compose 挂载路径一致)
rule_files:
- "alert_rules.yml"
# 指标抓取配置:对接 Node Exporter、MySQL Exporter 及自身
scrape_configs:
# 监控 Prometheus 自身运行状态
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控宿主机:对接 Node Exporter
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100'] # Node Exporter 容器地址
scrape_interval: 10s # 单独缩短宿主机指标抓取间隔,提升监控实时性
# 监控 MySQL:对接 MySQL Exporter
- job_name: 'mysql'
static_configs:
- targets: ['mysql-exporter:9104'] # MySQL Exporter 容器地址
scrape_interval: 10s # 数据库指标高频采集,及时发现异常
将上述内容保存至 /opt/prometheus-stack/prometheus/config/prometheus.yml。YAML 格式对缩进敏感,请确保使用 2 个空格进行缩进。
4.2 Prometheus 告警规则文件(alert_rules.yml)
这里定义了告警触发的具体条件、级别和描述信息,涵盖了主机和 MySQL 的核心监控场景,你可以根据实际业务需求进行扩展。
groups:
- name: 主机监控告警
rules:
# 主机 CPU 使用率过高告警:超过 80% 且持续 2 分钟触发,避免瞬时峰值误告警
- alert: 主机CPU使用率过高
expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
for: 2m
labels:
severity: critical # 告警级别(critical:紧急;warning:警告;info:提示)
annotations:
summary: "主机 {{ $labels.instance }} CPU 使用率过高"
description: "主机 {{ $labels.instance }} CPU 使用率已超过 80%,当前值:{{ $value | round 2 }}%,持续时间超过 2 分钟,请及时排查。"
# 主机内存使用率过高告警:超过 85% 且持续 2 分钟触发
- alert: 主机内存使用率过高
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 2m
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} 内存使用率过高"
description: "主机 {{ $labels.instance }} 内存使用率已超过 85%,当前值:{{ $value | round 2 }}%,持续时间超过 2 分钟,可能导致服务卡顿。"
# 主机磁盘使用率过高告警:根目录使用率超过 90% 触发
- alert: 主机磁盘使用率过高
expr: (1 - (node_filesystem_avail_bytes{mountpoint="/rootfs"} / node_filesystem_size_bytes{mountpoint="/rootfs"})) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} 磁盘使用率过高"
description: "主机 {{ $labels.instance }} 根目录磁盘使用率已超过 90%,当前值:{{ $value | round 2 }}%,请及时清理存储空间。"
- name: MySQL监控告警
rules:
# MySQL 服务不可用告警:Exporter 无法采集数据,持续 1 分钟触发
- alert: MySQL服务不可用
expr: up{job="mysql"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL 服务 {{ $labels.instance }} 不可用"
description: "MySQL 服务已停止运行或 MySQL Exporter 采集失败,持续 1 分钟未恢复,请检查数据库及 Exporter 状态。"
# MySQL 连接数过高告警:连接数超过 100 且持续 1 分钟触发
- alert: MySQL连接数过高
expr: mysql_connections > 100
for: 1m
labels:
severity: warning
annotations:
summary: "MySQL {{ $labels.instance }} 连接数过高"
description: "MySQL 当前连接数:{{ $value }},已超过阈值 100,持续时间超过 1 分钟,可能存在连接泄露或访问峰值。"
# MySQL 慢查询过多告警:慢查询数超过 5 个触发
- alert: MySQL慢查询过多
expr: mysql_slow_queries > 5
for: 1m
labels:
severity: warning
annotations:
summary: "MySQL {{ $labels.instance }} 慢查询过多"
description: "MySQL 当前慢查询数:{{ $value }},已超过阈值 5 个,持续时间超过 1 分钟,请优化慢查询语句。"
将上述内容保存至 /opt/prometheus-stack/prometheus/rules/alert_rules.yml。修改规则时,建议先在 Prometheus 的 UI 中测试表达式是否能正常查询到指标。
4.3 Alertmanager 告警配置文件(alertmanager.yml)
这个文件定义了告警通知的渠道(本文以邮件为例)、告警分组和重复通知策略,避免告警信息轰炸。
global:
resolve_timeout: 5m # 告警恢复后,等待 5 分钟发送恢复通知,避免瞬时恢复误通知
# 邮件服务器配置(需替换为实际邮箱信息,以下以 163 邮箱为例)
smtp_smarthost: 'smtp.163.com:465' # 邮箱 SMTP 服务器地址及 SSL 端口
smtp_from: 'your_email@163.com' # 发件人邮箱地址
smtp_auth_username: 'your_email@163.com' # 发件人邮箱账号
smtp_auth_password: 'your_auth_code' # 邮箱授权码(非登录密码,需在邮箱后台开启)
smtp_require_tls: false # 关闭 TLS 验证,避免连接失败
smtp_hello: '163.com'
# 告警路由规则:决定告警如何分发至接收渠道
route:
group_by: ['alertname', 'severity'] # 按告警名称、级别分组,同组告警合并发送
group_wait: 10s # 同组告警等待 10 秒,避免瞬间多告警重复推送
group_interval: 10s # 同组告警间隔 10 秒再次推送(未恢复时)
repeat_interval: 1h # 同一告警重复推送间隔(1 小时,避免轰炸)
receiver: 'email-notify' # 默认告警接收渠道
# 告警接收者配置:定义邮件接收人信息
receivers:
- name: 'email-notify'
email_configs:
- to: 'target_email@qq.com,target_email2@163.com' # 收件人邮箱(多个用逗号分隔)
send_resolved: true # 开启告警恢复通知,便于知晓问题已解决
# 告警抑制规则:避免重复告警(紧急告警触发时,抑制同实例下的警告告警)
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance'] # 按告警名称、实例维度抑制
配置说明:
- 邮箱授权码获取:登录你的邮箱,进入设置,开启 POP3/SMTP 服务,然后生成授权码(不同邮箱的操作路径可能略有差异)。
- 其他渠道:除了邮件,Alertmanager 还支持钉钉、企业微信、Slack 等通知渠道,你可以根据实际需求替换相关配置。
将上述内容保存至 /opt/prometheus-stack/alertmanager/config/alertmanager.yml。
五、启动服务并验证
5.1 启动所有组件
在 /opt/prometheus-stack 目录下执行命令,Docker Compose 会根据依赖关系自动启动所有容器。
# 后台启动服务(-d 表示后台运行)
docker-compose up -d
# 查看容器运行状态
docker-compose ps
# 排查启动故障(实时查看所有容器日志)
docker-compose logs -f
# 单独查看某组件日志(如 Prometheus)
docker-compose logs -f prometheus
正常情况下,所有容器的状态都应为“Up”。如果某个容器状态是“Exit”,就需要通过日志来定位问题,常见原因包括配置文件语法错误、目录权限不足或端口冲突。
5.2 组件可用性验证
我们需要逐一验证各个组件是否正常运行。
- Prometheus 验证:访问
http://宿主机IP:9090,进入 UI 界面 -> 点击顶部「Status -> Targets」-> 确认 prometheus、node、mysql 三个 Job 的状态均为「UP」,这表示指标抓取正常。
- Node Exporter 验证:访问
http://宿主机IP:9100/metrics,页面会显示大量宿主机指标数据(如 node_cpu_seconds_total),出现即正常。
- MySQL Exporter 验证:访问
http://宿主机IP:9104/metrics,页面显示大量 MySQL 指标数据(如 mysql_connections)即正常。
- Alertmanager 验证:访问
http://宿主机IP:9093,进入 UI 界面,可查看告警历史及当前状态。
- Grafana 验证:访问
http://宿主机IP:3000,使用账号 admin、密码 Grafana@123456 登录,登录成功即表示服务正常。
5.3 Grafana 可视化配置
成功登录 Grafana 后,需要添加数据源并导入监控面板。
5.3.1 添加 Prometheus 数据源
- 登录 Grafana -> 点击左侧菜单栏「设置(齿轮图标)-> Data sources -> Add data source」。
- 搜索并选择「Prometheus」-> 在「HTTP -> URL」中输入
http://prometheus:9090(这是容器内部的通信地址)。
- 点击底部「Save & test」,出现「Data source is working」提示即配置成功。
5.3.2 导入预置监控面板
无需自己从头创建图表,Grafana 社区提供了丰富的预置面板,直接导入即可使用。
- 点击左侧菜单栏「+ -> Import」。
- 输入面板 ID 并导入:
- 宿主机监控面板(Node Exporter):ID
1860(官方推荐,覆盖 CPU、内存、磁盘等核心指标)。
- MySQL 监控面板:ID
7362(支持连接数、慢查询、表空间等指标展示)。
- 选择我们刚刚添加的 Prometheus 数据源 -> 点击「Import」,面板会自动生成并展示数据。
5.4 告警功能验证
我们可以手动模拟一个告警场景,来验证整个告警链路是否通畅。
- 登录 Prometheus UI -> 点击顶部「Alerts」,查看所有告警规则状态(默认应为「Inactive」,表示没有告警触发)。
- 模拟主机 CPU 使用率过高:在宿主机执行
stress -c 4(需要先安装 stress 工具:yum install -y stress),持续运行 2 分钟后,观察对应告警规则的状态应变为「Firing」(触发中)。
- 查看 Alertmanager UI:确认告警已被接收,状态同样为「Firing」。
- 检查收件邮箱:此时你应该会收到告警邮件,其中包含告警摘要、描述及当前值。停止 stress 命令(按 Ctrl+C),等待大约 5 分钟后,你会收到另一封告警恢复的邮件。
如果告警没有正常推送,请依次排查:Prometheus 告警规则是否触发、Alertmanager 配置文件是否正确、邮箱服务器网络是否通畅。
六、常用操作与维护
6.1 核心操作命令
# 启动所有服务
docker-compose up -d
# 停止所有服务(保留容器及数据)
docker-compose stop
# 停止并删除所有容器(保留数据卷)
docker-compose down
# 重启所有服务
docker-compose restart
# 热加载 Prometheus 配置(修改配置后无需重启容器)
curl -X POST http://宿主机IP:9090/-/reload
# 热加载 Alertmanager 配置
curl -X POST http://宿主机IP:9093/-/reload
# 查看容器资源占用情况
docker stats
6.2 数据备份策略
生产环境中,定期备份核心数据至关重要。
- MySQL 数据:备份
/opt/prometheus-stack/mysql/data 目录。
- Prometheus 监控数据:备份
/opt/prometheus-stack/prometheus/data 目录。
- Grafana 面板配置:备份
/opt/prometheus-stack/grafana/data 目录。
建议通过 crontab 设置定时任务,编写备份脚本将数据备份到异地存储。
6.3 注意事项
- 密码安全:配置文件中的密码(MySQL、Grafana、邮箱授权码)建议使用环境变量或加密存储,避免明文暴露。生产环境务必修改为强密码并定期更换。
- 权限控制:宿主机目录权限建议细化(避免 777 权限),根据容器内运行的用户身份来调整目录权限,以提升安全性。
- 性能优化:根据监控目标的规模,适当调整
scrape_interval(抓取间隔)。大规模监控场景下,可以适当延长间隔,避免 Prometheus 占用过多系统资源。
- 高可用:生产环境应考虑部署 Prometheus 集群、Alertmanager 集群,并搭配 Grafana 多实例,以避免单点故障。
- 版本兼容:各组件版本需匹配(本文使用的版本组合经过测试,相对稳定)。升级版本前,务必先验证兼容性,避免配置失效或功能异常。
七、问题排查指南
- 容器启动失败:查看日志
docker-compose logs -f 组件名,重点排查配置文件语法错误(YAML 缩进、关键字拼写)、端口冲突、目录权限。
- Prometheus 目标状态为 Down:检查对应的 Exporter 容器是否正常运行、组件间网络是否连通(可进入 Prometheus 容器 ping 对应 Exporter 的容器名)、Exporter 的端口是否正常暴露。
- Grafana 无数据展示:检查 Prometheus 数据源配置的 URL 是否正确、Prometheus 是否能正常抓取到对应指标、面板的查询表达式是否匹配当前的指标名称。
- 告警无法推送:检查 Alertmanager 配置文件语法、邮箱授权码是否正确、宿主机网络是否能正常访问邮箱的 SMTP 服务器(可通过
telnet smtp.163.com 465 命令测试网络连通性)。


至此,一个功能完整的 Prometheus 监控栈就已经部署完成了。从主机资源到数据库性能,再到灵活的可视化和及时的告警通知,这个方案为你的系统提供了一层可靠的“观察层”。如果你在部署过程中遇到其他问题,或者想深入了解 云原生 监控的更多高级特性,欢迎在云栈社区与大家交流探讨。