Docker 部署 Grafana 如何持久化存储配置避免重启丢失?

文章导读
最稳妥的做法是在启动容器时,将宿主机目录挂载到容器内的 /var/lib/grafana 路径,这样即使容器被删除重建,数据依然留在宿主机上。
📋 目录
  1. 原理说明
  2. Docker CLI 部署步骤
  3. Docker Compose 部署方案
  4. 验证持久化是否生效
  5. 常见坑与排查
  6. 参考来源
A A

最稳妥的做法是在启动容器时,将宿主机目录挂载到容器内的 /var/lib/grafana 路径,这样即使容器被删除重建,数据依然留在宿主机上。

先说结论:通过 Docker 体积挂载(Volume Mount)映射数据目录是实现持久化的标准方案,适用于所有基于 Docker 的 Grafana 部署场景。

  • 适合:需要保留仪表盘、数据源配置、插件及用户信息的生产或测试环境。
  • 先准备:在宿主机创建用于存储数据的目录,并确认文件权限。
  • 验收:容器重启后,检查原有仪表盘和数据源配置是否依然存在。

原理说明

Docker 容器的文件系统是分层的,默认情况下,容器内产生的所有写入操作都存储在可写层中。一旦容器被删除(docker rm),这一层数据就会随之消失。Grafana 的核心配置、SQLite 数据库(默认存储方式)、插件和用户信息都保存在容器内的 /var/lib/grafana 目录下。如果不将这个目录挂载到宿主机,每次重建容器都相当于是一次全新的安装。

Docker CLI 部署步骤

第一步:准备宿主机目录
在运行容器前,先在宿主机创建一个目录用于存放数据。例如:

Docker 部署 Grafana 如何持久化存储配置避免重启丢失?
mkdir -p ~/grafana-data

第二步:修正文件权限(关键)
Grafana 官方容器默认使用 UID 472 运行。如果宿主机目录权限不对,容器可能无法写入数据,导致启动失败或数据无法保存。建议将目录所有者改为 472:

chown -R 472:472 ~/grafana-data

第三步:启动容器
使用 -v 参数挂载目录启动容器。建议指定具体版本号代替 latest,避免意外升级导致兼容性问题:

docker run -d -p 3000:3000 \
  `--name`=grafana \
  -v ~/grafana-data:/var/lib/grafana \
  grafana/grafana-oss

Docker Compose 部署方案

对于生产环境,建议使用 Docker Compose 管理服务,便于版本控制和配置维护。创建 docker-compose.yml 文件:

version: '3.8'
services:
  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
    restart: unless-stopped
    user: "472:472"

启动服务:

Docker 部署 Grafana 如何持久化存储配置避免重启丢失?
docker-compose up -d

验证持久化是否生效

1. 界面验证
登录 Grafana 网页,创建一个测试仪表盘或添加一个测试数据源。然后重启容器:

docker restart grafana

刷新页面,如果刚才创建的仪表盘和数据源还在,说明持久化生效。

2. 文件验证
查看宿主机挂载目录,应该能看到 grafana.db 等文件生成:

Docker 部署 Grafana 如何持久化存储配置避免重启丢失?
ls -l ~/grafana-data

常见坑与排查

1. 权限拒绝(Permission Denied)
这是最常见的问题。如果日志中出现 panic 或无法写入 sqlite 的错误,通常是宿主机目录权限不属于容器内的用户(UID 472)。不要随意 chmod 777,优先使用 chown 修正所有者。

2. 挂载路径错误
确保挂载的是 /var/lib/grafana。有些旧教程可能指向其他路径,或者只挂载了配置目录 /etc/grafana 而忽略了数据目录,这会导致配置保留但仪表盘丢失。

3. 容器重建而非重启
使用 docker restart 不会丢失数据,但 docker rm 后重新 run 如果没有 -v 参数则会丢失。持久化是为了应对容器被删除重建的场景。

参考来源

  • Grafana Labs - Install Grafana using Docker: https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/