备份泊坞窗卷 - 简单的tar归档是不够的?

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数据目录......但我认为这个问题以相同的方式应用于这两种方法.

BMi*_*tch 5

命名卷可以将数据存储在 /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 应该保持更加一致。如果它们过渡到容器镜像管理之类的东西,我需要改变的东西越少越好。