Prometheus 容器重启后数据丢失,最直接的解决办法是在启动容器时将数据目录挂载到宿主机,这样即使容器被删除,数据依然保留在宿主机上。
先说结论:必须配置 volume 挂载,否则容器重建即丢失所有监控历史。
- 适合:Docker 及 Kubernetes 部署 Prometheus 的场景
- 先准备:确认宿主机磁盘空间及目录权限(K8s 需确认 StorageClass)
- 验收:重启容器或删除 Pod 后检查数据目录文件大小是否变化
Docker 命令速用版
docker run -d `--name` prometheus -p 9090:9090 -v /opt/prometheus/data:/prometheus prom/prometheusKubernetes 持久化配置示例
在 K8s 环境中,需通过 PVC 绑定存储卷,并在 Deployment 中挂载至 /prometheus 路径。
1. 创建 PVC 配置(prometheus-pvc.yaml):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi2. 部署时挂载 volume(Deployment 片段):
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus-data
containers:
- name: prometheus
volumeMounts:
- name: data
mountPath: /prometheus为什么会这样
容器默认的文件系统是临时的。Prometheus 内部默认将时序数据写在容器内的/prometheus 目录,一旦容器停止并被移除,这部分文件系统随之消失。挂载卷(Volume)的作用是将宿主机的目录映射到容器内部,让数据落地到宿主机磁盘。
分步处理(Docker 环境)
1. 创建宿主机目录
mkdir -p /opt/prometheus/data2. 调整权限(重要)
官方镜像默认使用 65534 用户运行,需授权该用户写入宿主机目录:
chown -R 65534:65534 /opt/prometheus/data3. 启动容器并挂载
使用 -v 参数将宿主机目录映射到容器内的/prometheus 路径。
怎么验证是否生效
1. 写入测试:观察 Prometheus 界面右下角 Status 是否为 Active。
2. 重启测试:执行 docker restart prometheus(K8s 可删除 Pod),再次查看界面数据是否连续。
3. 文件检查:在宿主机执行 ls -lh /opt/prometheus/data,确认有 block 文件生成且大小随时间增长。
常见坑
1. 权限拒绝:如果不修改宿主机目录所有者,容器启动会报 Permission denied。
2. 磁盘空间:监控数据会持续增长,需设置 `--storage`.tsdb.retention.time 限制保留时间,默认是 15d。
3. 路径混淆:挂载目标必须是容器内的/prometheus,而不是配置文件目录。
参考来源
- Prometheus Official Documentation, Storage, https://prometheus.io/docs/prometheus/latest/storage/
- Docker Official Documentation, Use volumes, https://docs.docker.com/storage/volumes/