Docker卷备份和还原


23

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

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

从同一篇博客文章中我知道我不需要主机挂载来访问卷中的文件,我可以使用它docker inspect来查找文件在哪里。

但这是我的问题:我正在考虑仅备份构建容器和与其关联的卷所需的dockerfile。如果可能不得不从备份中还原所有内容,那么我将如何知道哪个卷目录对应于哪个容器?重建容器会导致ID和卷路径发生更改,因此我需要一些其他信息来匹配它们。我还应该备份什么(如果有的话)以便能够真正还原所有内容?

Answers:


24

你是对的。由于您可以有多个容器,它们各自具有卷,因此需要跟踪哪个卷对应于哪个容器。具体操作取决于您的设置:我为数据容器使用名称-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 -

因此,这意味着您需要备份:

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

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


谢谢,这是一个公平的妥协。使用单独的容器存储数据有明显的优势吗?
fcoelho 2014年

这再次取决于您的设置。使用数据容器很有意义,因为您可以使用“ volumes-from”轻松引用它,并提取所有内部信息:您只需将卷从容器附加到其他容器,而不用考虑路径和安装点。
Johannes'fish'Ziemke'2

我有此错误无效选项-z。似乎busybox中的默认tar不支持此功能。
Dzung Nguyen 2014年

6
JQ非常酷,但不是引进的依赖,为什么不使用docker inspect同样内置了模板化,像这样: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" )。提醒人们不要在积极使用文件(例如数据库)时以这种方式备份文件,这也很明智。
mc0e

2
在Docker 1.8中,格式已更改- Volumes已经不存在,Mounts取而代之的是不同的结构。我们需要做更多的工作range才能找到我们感兴趣的挂载点VOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
JarekPrzygódzki,2017年

5

在较新的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

2
docker cp通过网络发送所有内容。您要避免这种情况,尤其是在您的Docker卷已经是btrfs卷的情况下。
JarekPrzygódzki17年

2
问题提到备份和还原。这个答案中使用的还原示例docker cp将是很好的。
MadMike '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.