Docker 卷备份和恢复

fco*_*lho 24 backup docker

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

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

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

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

Joh*_*mke 25

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

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • jq 非常酷,但与其引入依赖项,不如使用内置模板的`docker inspect`s 像这样:`VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"} }' "${NAME}-data" )`。提醒人们不要期望以这种方式备份正在使用中的文件(例如数据库)也是明智之举。 (6认同)
  • 在 Docker 1.8 中,格式发生了变化——`Volumes` 消失了,取而代之的是具有不同结构的 `Mounts`。我们需要对 `range` 做更多的工作来找到我们感兴趣的挂载点 `VOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/ in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")` (2认同)

cze*_*asz 7

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

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

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/
Run Code Online (Sandbox Code Playgroud)

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

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一个示例如何将目录从容器复制到tar.gz文件:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • `docker cp` 通过网络发送所有内容。这是您想要避免的事情,尤其是当您的 Docker 卷已经是 btrfs 卷时。 (2认同)
  • 问题提到备份和**恢复**。这个答案中使用`docker cp`的恢复示例会很好。 (2认同)