我“继承”了某种形式的 Dockerized 服务器环境,现在我必须实现一个备份概念 - 特别是对于 Owncloud 容器,它将用户文件存储在 Docker 卷内。 Docer 文档 [1] 表示“卷比绑定挂载有几个优势”,因此“是首选机制”。 列出的优势之一是“卷更容易备份”,文档建议使用以下命令来创建卷的 tar 备份:
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
然而,特别是对于备份(我使用 borg 备份将主机文件同步到异地仓库),我发现这种方式有几个缺点:
- 对于每次备份,您必须在本地复制整个数据,这需要两倍的磁盘空间和复制时间。
- 每次备份都会创建一个新的 BLOB - 未更改的文件必须再次复制。
- 要恢复单个 Owncloud 文件,您必须从备份中恢复整个 tar(同步到备份之前解压将使所需的磁盘空间增加三倍)。...
我对 docker 还比较陌生,所以我可能还没有对 docker 生态系统有一个完整的了解。但就我目前所知,对于这种情况,我认为绑定挂载绝对是最好的解决方案。而且无论如何,我没有从卷的其他优势中受益。还是我错过了什么?使用绑定挂载有什么缺点吗?
直接备份 /var/lib/docker/volumes/ 怎么样?
通过搜索,我找到了 owncloud [2] 的这篇博客文章,其中建议直接备份 /var/lib/docker/volumes/owncloud_files/_data。对我来说,这似乎不是最干净的方法。
但是,处理当前的情况,我暂时打算这样做。这样安全吗?(当然,考虑到一致性所需的预防措施,例如关闭数据库容器、owncloud 维护模式等 - 我认为这里提到的解决方案无论如何都需要这些预防措施!?)
答案1
此外,无论如何,我也没有从卷的其他优势中受益。还是我遗漏了什么?使用绑定安装有什么缺点吗?
我似乎明白 Docker 希望您忘记主机的存在;事实上,有时您无法访问它,因此卷是保存数据最明显的方式。
绑定挂载是主机上的一个路径,因此您必须以某种方式“管理”它(分配空间、挂载分区......)外部Docker。也许您已经有一个系统可以实现这一点,例如安装 Docker、docker-compose 并将文件上传docker-compose.yml
到服务器的 Ansible playbook。但是如果您没有,或者您只是将文件指向docker-compose
远程 Docker 守护程序,那么您只需要使用它,不需要其他任何东西:然后您需要卷中的数据。
直接备份 /var/lib/docker/volumes/ 怎么样?
我同意这不是一个好主意:这是 Docker 自己的空间,我不会触碰它,就像我不会从/var/lib/postgresql
正在运行的实例上复制一样。
或者我遗漏了什么?
为什么你不跑,borg
而是tar
跑到你的临时容器里呢?