我正在使用 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