【发布时间】:2020-03-15 08:50:43
【问题描述】:
假设项目已使用以下脚本备份:
并且我已经压缩了带有完整备份的 tar 存档,是否有任何“单线”方法可以在干净的机器上成功恢复和运行项目?
【问题讨论】:
-
不提供外部链接,稍后会更改。尝试将相关代码本身提出问题
标签: bash docker docker-compose backup restore
假设项目已使用以下脚本备份:
并且我已经压缩了带有完整备份的 tar 存档,是否有任何“单线”方法可以在干净的机器上成功恢复和运行项目?
【问题讨论】:
标签: bash docker docker-compose backup restore
标准的“哎呀,我失去了所有的容器”Docker 恢复脚本应该是粗略的
# Get a copy of the repository with docker-compose.yml
git clone git@github.com:...
# Unpack a backup specifically of the bind-mounted
# data directories
tar xzf data-backup.tar.gz
# Recreate all of the containers from scratch
docker-compose up -d --build
这需要确保应用程序中的所有数据都存储在单个 Docker 容器之外的某个位置。在 Docker Compose 设置中,这意味着使用 volumes: 指令将数据存储在其他地方。一个典型的做法是在数据库中存储尽可能多的数据,并且在非数据库容器中根本没有持久数据。如果您担心丢失整个 /var/lib/docker 树,那么更喜欢将挂载绑定到命名卷,并使用您通常使用的任何常规备份解决方案来备份相应的主机目录。
你展示的脚本试图保留一些不需要备份的东西:
docker inspect 是一个非常底层的诊断工具,运行它通常没有用;您无法从中恢复任何东西docker save 映像,因为它们位于外部 Docker 注册表(Docker Hub、AWS ECR 等)中,并且无论您是否已将其 Dockerfile 签入源代码控制并可以重建它们docker export 单个容器,因为它们不保存可变数据,并且无论如何您都需要非常常规地销毁它们它所做的一件事是利用众所周知的 Docker 内部细节来备份命名卷的内容。手动访问 /var/lib/docker 中的文件通常不是最佳做法,并且无法保证文件的实际格式。 Docker 文档discusses backing up and restoring named volumes 以更便携的方式(但这是我发现绑定挂载更方便的地方)。
【讨论】: