部署 Prometheus Server:二进制与 Docker 实战

Prometheus Server 是整个 APM 指标采集体系的核心,负责从各类 exporter 拉取指标、存储时序数据并通过 PromQL 提供查询。本章从原理出发,覆盖两种主流部署方式——二进制直接安装与 Docker 容器化运行,并重点解决存储路径配置与持久化、启动验证、常见错误等工程化问题。

原理概述

Prometheus Server 的时序数据库(TSDB)将采集到的样本按时间序列存储在本地文件系统中。默认数据目录为 data/,可通过 --storage.tsdb.path 参数指定。该目录包含 .wal、.block 等子目录,其读写性能直接影响采集吞吐与查询响应。因此,存储路径必须配置在独立磁盘或高性能卷上,并启用持久化机制。

二进制部署直接与操作系统交互,资源开销最小;Docker 部署则提供环境隔离、快速编排和与容器编排平台(如 Kubernetes)的天然集成。两种方式各有适用场景,下表快速对比:

对比维度二进制部署Docker 部署
安装复杂度中等(手动配置 systemd)低(一条命令启动)
资源消耗最低轻微额外开销(容器运行时)
环境隔离依赖主机 OS完全容器化隔离
持久化配置本地目录固定Host Volume / Named Volume
升级回滚自行管理版本镜像标签切换,回滚快
生产推荐裸金属 / VMKubernetes / 微服务
选型建议: 若你使用纯物理机或传统虚拟化环境,推荐二进制 + systemd 管理;若团队已采用容器编排平台,直接走 Docker 部署并挂载持久化卷。
Prometheus Server 部署流程 部署 Prometheus 二进制:下载 & 解压 配置 prometheus.yml --storage.tsdb.path systemd 管理 / 前台进程 Docker:拉取镜像 docker run -v 持久化卷 数据目录 /prometheus 容器自动重启策略 验证 Web UI /metrics 💡 两种方式最终验证方法完全一致

二进制部署:逐步骤执行

1. 下载并解压

获取 Prometheus 官方最新版(或者固定生产版本)。以 Linux amd64 为例:

wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
tar xzf prometheus-2.53.0.linux-amd64.tar.gz
cd prometheus-2.53.0.linux-amd64/

2. 配置 prometheus.yml

编辑配置文件,至少定义全局参数与默认 job:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

生产环境下需增加存储路径参数,可创建 /etc/prometheus/prometheus.yml 并指定数据目录。

3. 启动二进制进程

直接前台启动(用于测试):

./prometheus --config.file=prometheus.yml --storage.tsdb.path=/data/prometheus

使用 systemd 管理(生产推荐),创建 /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus Server
After=network.target

[Service]
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data
Restart=always
User=prometheus
Group=prometheus

[Install]
WantedBy=multi-user.target

随后启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus

Docker 部署:一行命令完成

拉取官方镜像并启动,同时挂载主机卷以实现数据持久化:

docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /host/prometheus/data:/prometheus \
  -v /host/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus
  • -v /host/prometheus/data:/prometheus:容器内的 /prometheus(默认 TSDB 路径)映射到宿主机目录,保证容器重启后数据不丢失。
  • -v /host/prometheus/prometheus.yml:挂载自定义配置文件。
  • Docker Compose 方式更便于管理,适用于多服务环境。
⚠ 权限陷阱: 挂载的宿主机目录必须具有 uid:gid 权限(默认容器内 prometheus 用户 uid 为 65534)。执行 chown 65534:65534 /host/prometheus/data,否则容器启动时会因写权限失败。

持久化与存储路径配置要点

配置项说明建议值
--storage.tsdb.pathTSDB 数据目录SSD 挂载的独立分区,如 /data/prometheus 或 /var/lib/prometheus
--storage.tsdb.retention.time数据保留时间默认 15d,生产可设为 30d 或 90d
--storage.tsdb.retention.size数据保留大小(如果超过则删除旧数据)按磁盘容量设置,如 100GB
Docker 卷类型Host Volume / Named Volume生产环境推荐 Named Volume 便于备份

验证启动状态与 Web UI

无论哪种部署方式,验证步骤完全一致:

  1. 检查进程存活:
    ps aux | grep prometheus   # 二进制
    docker ps | grep prometheus # Docker
  2. 访问 Web UI: 浏览器打开 http://<server-ip>:9090,确认出现 Prometheus 图形界面。
  3. 查看 Target 状态: 导航栏 Status > Targets,确保 Prometheus 自身 job 为 UP。
  4. 验证 /metrics 端点:
    curl http://localhost:9090/metrics | head -20
    应输出大量带 # HELP 和 # TYPE 的指标行。
快速健康检查 API: GET /-/ready 返回 200 表示服务就绪;GET /-/healthy 返回 200 表示健康。

常见错误与解决方法

  • "Permission denied" 写数据目录:原因 data 目录权限不足。修正:sudo chown -R 65534:65534 /data/prometheus(二进制);Docker 中确保宿主机挂载目录可写。
  • "error loading config: couldn't parse configuration file":YAML 缩进错误。使用 promtool check config prometheus.yml 校验。
  • "404 page not found" 访问 Web UI:启动时未绑定正确 IP 或端口被占用。检查启动日志中 Listening on :9090 消息,或改用 --web.listen-address=0.0.0.0:9090。
  • Docker 容器频繁重启:查看 docker logs prometheus,常见原因同上权限或配置错误。

性能与稳定性优化

  • 存储路径选择 SSD:Prometheus 的 WAL 和 compaction 对磁盘 I/O 敏感,务必使用低延迟存储。
  • 设置合理的 retention 策略:同时配置时间与大小上限,防止磁盘写满。--storage.tsdb.retention.time=30d --storage.tsdb.retention.size=100GB。
  • 二进制部署启用 systemd Restart:确保 Server 崩溃后自动拉起。
  • Docker 启动添加资源限制:使用 --memory=2g --cpus=2 避免被其他容器抢占。
  • 开启 Web 压缩:--web.enable-remote-write-receiver 与 --web.enable-lifecycle 按需开启,后者支持热加载配置。
  • 日志分级:--log.level=info 生产环境中降低为 warn 可减少磁盘写入。
小实验: 部署完成后,执行 curl -X POST http://localhost:9090/-/reload 热加载配置(需开启 --web.enable-lifecycle),观察 Target 列表无断开。验证生活质量的提升!