【问题标题】:Restore a whole docker-compose project from backup从备份中恢复整个 docker-compose 项目
【发布时间】:2020-03-15 08:50:43
【问题描述】:

假设项目已使用以下脚本备份:

https://gist.githubusercontent.com/pirate/265e19a8a768a48cf12834ec87fb0eed/raw/64145b8275a081e0c3082365bb1a5835c8b01b3c/docker-compose-backup.sh

并且我已经压缩了带有完整备份的 tar 存档,是否有任何“单线”方法可以在干净的机器上成功恢复和运行项目?

【问题讨论】:

  • 不提供外部链接,稍后会更改。尝试将相关代码本身提出问题

标签: bash docker docker-compose backup restore


【解决方案1】:

标准的“哎呀,我失去了所有的容器”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 以更便携的方式(但这是我发现绑定挂载更方便的地方)。

【讨论】:

  • 感谢您分享您的担忧,但它不符合我的问题。这与最佳实践无关。备份已经完成,采用脚本中明确规定的格式(即 .tar.gz)。我正在寻找一种可以提取存档内容、在本地构建映像并运行它的单线器(无需 repo 克隆或连接外部 Docker 注册表)。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2019-05-06
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多