Docker 卷备份和恢复

Docker 卷备份和恢复

我正在使用 Docker 在 CentOS 6.4 服务器上部署一些服务,并且正在尝试弄清楚如何正确备份它们生成的数据。

例如,其中一个服务是 Web 应用程序,用户可以在其中上传文件。对于此容器,我有一个/files要备份的卷。主机挂载看起来有些不受欢迎,因为这种挂载绝对不可移植 — 如这篇博文docker 卷文档

我从同一篇博文中知道,我不知道需要主机挂载来访问卷中的文件,我可以使用它docker inspect来找出文件的位置。

但我的问题是:我当时正在考虑只备份构建容器及其相关卷所需的 dockerfile。万一我必须从备份中恢复所有内容,我该如何知道哪个卷目录对应哪个容器?重建容器会导致 ID 和卷路径发生变化,因此我需要一些额外的信息来匹配它们。我还应该备份什么才能真正恢复所有内容?

答案1

你说得对。由于你可以拥有多个带有独立卷的容器,因此你需要跟踪哪个卷对应哪个容器。如何做到这一点取决于你的设置:我使用名称 -data 作为数据容器,因此可以清楚地看到图像属于哪个容器。这样就可以像这样备份它:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

现在您只需要重建图像并重新创建数据容器:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

所以这意味着您需要备份:

  • Dockerfile
  • 体积
  • 容器中的卷路径
  • 卷所属容器的名称

更新:同时,我创建了一个工具来备份容器及其卷(容器):https://github.com/discordianfish/docker-backup以及可以创建备份并将其推送到 s3 的备份映像:https://github.com/discordianfish/docker-lloyd

答案2

在较新的 Docker(已在 中测试1.9.1, build 9894698)中,您可以使用cp命令

下面是如何将目录从容器复制到主机的示例:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

以下是如何将目录从容器复制到文件的示例tar

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

最后但同样重要的是,这是一个如何将目录从容器复制到tar.gz文件的示例:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

相关内容