我正在使用 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
在较新的 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)