Docker 容器里的 Prometheus 如何持久化数据?
Docker 运行 Prometheus 应显式复用持久数据卷;写入容器层的数据会随容器删除丢失,匿名卷重建未必自动复用:-v prometheus-data:/prometheus 或绑定宿主机目录。本文给出 docker run 与 compose 两种配置、权限问题与备份建议。
给容器挂数据卷即可:docker run -v prometheus-data:/prometheus ...——官方容器示例通常把 TSDB 写到 /prometheus,实际由 --storage.tsdb.path 决定,挂载命名卷或宿主机目录后,容器删了重建数据还在。
docker run 方式
docker run -d --name prometheus \
-p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus-data:/prometheus \
prom/prometheus
docker-compose 方式
services:
prometheus:
image: prom/prometheus
ports: ["9090:9090"]
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
volumes:
prometheus-data:
两个常见坑
- 权限问题:先检查所用镜像版本的运行 UID/GID、宿主映射和挂载标签,仅调整指定数据目录的必要权限;不要假定所有版本均为 65534 或盲目递归 chown;
- 配置文件也建议挂载:只挂数据不挂配置,重建容器后配置又回默认值——把 prometheus.yml 与规则文件一起挂载。
备份与长期保留
快照 API /api/v1/admin/tsdb/snapshot 需启用受保护的 admin API(--web.enable-admin-api),并将快照复制到独立存储、测试恢复,留在同一个卷上不构成独立备份;需要长期存储与跨实例查询时,上 Thanos/Mimir 或直接把数据写入云端托管服务。
常见问题(FAQ)
Q:命名卷和绑定目录选哪个? 两者均可用于生产,应按权限、备份、迁移和文件系统兼容性选择。命名卷通常独立于容器,但 docker compose down -v 或显式删卷会删除数据,匿名卷重建不保证自动复用。
Q:数据能直接拷走迁移吗? 可在干净停机后复制完整 TSDB 数据,并核对版本、权限、文件系统与 storage.tsdb.path;不应把不兼容网络文件系统当作透明持久化。