背景说明

通常我们会采用本地持久存储卷来保存一些 Docker 容器服务的配置与数据,这样做的好处是配置与数据可以在容器主机上比较方便的进行修改、备份,因为容器本身并不保存任何数据,所以容器可以做到随用随弃,便于升级。

配置 Grafana 容器数据持久化(容器升级)

Grafana 容器镜像:

1
grafana/grafana

容器数据目录:

1
2
/etc/grafana/grafana.ini            # 配置文件,owner & group: root
/var/lib/grafana                    # 数据目录,owner & group: grafana

容器主机挂载点:

1
2
3
/home/docker/grafana                # 宿主机 grafana 容器的家目录
/home/docker/grafana/grafana.ini    # 挂载点 grafana 配置
/home/docker/grafana/data           # 挂载点 grafana 数据目录 data

关于 Grafana 容器存储持久化请先详细阅读一下官方文档说明:

  • Installing using Docker

    • Grafana container with persistent storage (recommended)
    • Grafana container using bind mounts

先在宿主机创建挂载点

创建挂载点

1
2
3
4
$ mkdir -p /home/docker/grafana
$ cd /home/docker/grafana
$ mkdir data
$ touch grafana.ini

创建容器启动脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ vim run.sh

# 填入如下内容, 有关 ID 的说明请参考前面给出的文档
# 脚本中分别挂载了容器的数据目录以及配置文件到宿主机

#!/bin/sh

ID=$(id -u)

docker run --name grafana --net monitor --restart always --user $ID --volume "$PWD/data:/var/lib/grafana" --volume "$PWD/grafana.ini:/etc/grafana/grafana.ini" -p 3000:3000 -d grafana/grafana

echo

docker ps | grep grafana

$ chmod +x run.sh

Next, 由于我已经创建好了且不带数据卷的 Grafana 容器,所以将会以升级的方式来添加容器数据卷,操作步骤: 备份 -> 删除旧容器 -> 启动新容器。(Note: 如果是新建容器则直接启动即可)

备份数据

为什么要备份呢?

因为已有容器未作持久化层,容器删除后数据会丢失,所以先备份,然后新创建的容器再与备份数据挂载,这样就可以保留原有数据了

从已有容器中拷贝相关数据到本地挂载点: 使用 docker cp 命令

1
2
3
4
$ cd /home/docker/grafana
$ docker cp grafana:/etc/grafana/grafana.ini .
$ docker cp grafana:/var/lib/grafana/ .
$ mv grafana data

更新容器并启动

删除旧容器(Note: 未创建数据卷的容器执行删除操作会丢失所有数据)

1
2
$ docker stop grafana
$ docker rm grafana

启动新容器, 直接运行前面创建好的脚本:run.sh

1
./run.sh

Note: 宿主机上更新配置文件后,需要重启容器才会生效

查看日志可执行如下命令:

1
docker logs -f grafana

Note: 容器默认日志是打印在终端的,并未记录到文件中,这里我没修改采用的是默认设置,所以使用上面的命令查看日志

至此,Grafana 容器升级完成。

配置 InfluxDB 数据持久化

容器镜像:tutum/influxdb

容器数据目录:

1
2
/config/config.toml                 # 配置文件
/data                               # 数据目录

Host:

1
2
3
/home/docker/influxdb               # 宿主机 influxdb 容器的家目录
/home/docker/influxdb/config.toml   # 挂载点 influxdb 配置
/home/docker/influxdb/data          # 挂载点 influxdb 数据目录 data

先在宿主机创建挂载点

创建挂载点

1
2
3
4
$ mkdir -p /home/docker/influxdb
$ cd /home/docker/influxdb
$ mkdir data
$ touch confit.toml

创建容器启动脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ vim run.sh

# 填入如下内容

#!/bin/sh

echo 'docker run --name influxdb --net monitor --restart always -v "$PWD/config.toml:/config/config.toml" -v "$PWD/data:/data" -p 8083:8083 -p 8086:8086'
docker run --name influxdb --net monitor --restart always -v "$PWD/config.toml:/config/config.toml" -v "$PWD/data:/data" -p 8083:8083 -p 8086:8086 -d tutum/influxdb

echo

echo 'docker ps'
docker ps


$ chmod +x run.sh

Next, 由于我已经创建好了, 且没有指定数据卷的 Influxdb 容器,所以将会以升级的方式来添加容器数据卷,操作步骤: 备份 -> 删除旧容器 -> 启动新容器。(Note: 如果是新建容器则直接启动即可)

备份数据

根据 tutum/influxdb 容器的 Dockerfile 描述,构建镜像时已经创建了数据卷:容器挂载点:/data, 对应宿主机的挂载点在 /var/lib/docker/volumes/{sha256} 下, 具体的路径可以通过如下命令得到,即:

1
2
3
$ docker inspect influxdb | grep volume
    "Type": "volume",
    "Source": "/var/lib/docker/volumes/50963a680b3110e7223e8bc766a3e819fc006ca58131c190beae8e82af961ca6/_data",

其中 /var/lib/docker/volumes/50***/_data 目录下就是 influxdb 容器存储在宿主机上的数据

然后,我们将容器数据拷贝到我们创建好的目录下进行备份,同时也方便管理,这里直接用 docker cp 拷贝,执行命令如下:

1
2
3
4
5
$ cd /home/docker/influxdb
$ docker cp influxdb:/config/config.toml .
$ docker cp influxdb:/data .

# ... 等好一会儿

更新容器并启动

1
2
3
4
5
6
# 删除旧容器,其默认的数据卷也一并删除,即加 -v 参数
$ docker stop influxdb
$ docker rm -v influxdb

# 启动新容器
$ ./run.sh

至此,Influxdb 容器升级完成。

See Also

Thanks to the authors 🙂