欢迎光临
我们一直在努力

Prometheus 全家桶 Docker Compose 部署及告警配置文档

一、文档概述

本文档详细介绍如何通过 Docker Compose 一键编排部署 Prometheus、Grafana、MySQL、MySQL Exporter、Node Exporter 及 Alertmanager 组件,实现宿主机、MySQL 数据库的指标采集、可视化展示及告警通知功能。所有组件采用容器化运行,兼顾快速搭建与环境一致性,适用于测试环境快速部署及生产环境基础架构搭建(生产环境需补充高可用及数据备份策略)。

部署环境: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:
prometheusnetwork # 加入自定义网络,实现组件间隔离通信
command: defaultauthenticationplugin=mysql_native_password # 兼容旧版认证,避免 Exporter 连接失败

# Node Exporter:采集宿主机 CPU、内存、磁盘、网络等资源指标
node-exporter:
image: prom/nodeexporter:v1.7.0
container_name: nodeexporter
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:
prometheusnetwork

# MySQL Exporter:采集 MySQL 连接数、查询量、表空间等指标
mysql-exporter:
image: prom/mysqldexporter:v0.15.1
container_name: mysqlexporter
restart: always
ports:
"9104:9104"
environment:
# 配置 MySQL 连接信息,通过容器名实现组件间通信(无需依赖宿主机 IP)
DATA_SOURCE_NAME: "exporter:Exporter@123456@(mysql:3306)/"
depends_on:
mysql # 依赖 MySQL 服务,确保 MySQL 启动后再启动 Exporter
networks:
prometheusnetwork

# 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:
nodeexporter
mysqlexporter # 依赖两个 Exporter,确保指标源就绪
networks:
prometheusnetwork

# 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:
prometheusnetwork

# 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:
prometheusnetwork

# 自定义桥接网络:实现组件间通信隔离,避免与宿主机其他容器冲突
networks:
prometheus-network:
driver: bridge

四、编写各组件核心配置文件

Docker Compose 仅定义容器运行参数,需单独编写各组件的核心配置文件,实现指标采集、告警规则、通知推送等核心功能,所有配置文件均挂载至宿主机目录,便于修改与维护。

4.1 Prometheus 配置文件(prometheus.yml)

该文件用于定义指标抓取规则、关联告警规则文件及 Alertmanager 地址,确保 Prometheus 能正常抓取各 Exporter 指标并触发告警。

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 服务 → 生成授权码(不同邮箱操作路径略有差异,如 QQ 邮箱需在「账户」中开启)。
  • 除邮件外,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 登录后,需添加 Prometheus 数据源并导入预置面板,实现指标可视化展示。

    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):1860(官方推荐,覆盖 CPU、内存、磁盘等指标)。
  • MySQL 监控面板: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 数据源配置是否正确、Prometheus 是否能正常抓取对应指标、面板查询表达式是否匹配当前指标。
    • 告警无法推送:检查 Alertmanager 配置文件语法、邮箱授权码是否正确、宿主机是否能访问邮箱 SMTP 服务器(可通过 telnet 测试:telnet smtp.163.com 465)。

    更多内容可以关注公众号 linux运维客栈 获取

    赞(0)
    未经允许不得转载:171主机测评 » Prometheus 全家桶 Docker Compose 部署及告警配置文档
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址