gyp*_*ark 16 backup docker docker-volume
我在三台机器上运行几个Docker容器,组成一个Swarm集群.
一些存储持久数据的容器(如DB,Redis等)使用数据卷.(我尽量避免使用bind-mount)
此类数据卷位于/ var/lib/docker/volumes /中,并为每个卷分配自定义名称而不是随机序列ID:
# ls /var/lib/docker/volumes/
redis-data postgres-data fluentd-data ...
Run Code Online (Sandbox Code Playgroud)
我想每天定期备份这些卷,例如每天,以便我可以在发生机器故障时进行恢复并在以后修复.
但是,我在google中找到的每个文档都说明了使用新Linux容器的方法,并且tar:
https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Run Code Online (Sandbox Code Playgroud)
为什么?如果我只是归档/var/lib/docker/volumes/VOLUME目录并将其复制到其他机器有什么问题吗?例如,权限,uid,gid等?
$ tar -zcvf redis.tgz /var/lib/docker/volumes/redis-data
Run Code Online (Sandbox Code Playgroud)
PS
有一种情况是,备份使用tar可能会因归档期间数据的更改而导致数据不一致.例如,当DB仍在运行并且执行inserts或updates 时归档DB数据目录......但我认为这个问题以相同的方式应用于这两种方法.
命名卷可以将数据存储在 /var/lib/docker 之外。例如,您可以使用以下命令创建命名绑定安装:
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
Run Code Online (Sandbox Code Playgroud)
或者这是一个用于 NFS 挂载的:
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=nfs.example.com,rw \
--opt device=:/path/to/dir \
foo
Run Code Online (Sandbox Code Playgroud)
在这些场景中,tar 备份以与容器相同的方式访问数据,因此无论命名卷是如何创建的,都会执行备份。它还可以有效地将数据导出为通用格式,该格式不仅可以由其他容器使用,而且可以在您移动应用程序的任何地方使用。
如果您发现自己需要对卷内容进行更多控制,以实现更直接的备份,那么命名绑定挂载是命名卷和主机挂载之间的中间点。您可以将该目录视为容器的命名卷,但其中包含的数据只是主机上要备份的另一个目录。
就我个人而言,我倾向于将 /var/lib/docker 视为黑匣子。虽然内容非常可读,但 docker 可以在版本之间自由迁移和更改其中的内容,而用户使用的 API 应该保持更加一致。如果它们过渡到容器镜像管理之类的东西,我需要改变的东西越少越好。
| 归档时间: |
|
| 查看次数: |
1744 次 |
| 最近记录: |