如何备份 Docker 容器及其数据卷?

新手上路,请多包涵

我一直在使用这个 Docker-image tutum/wordpress 来演示一个 Wordpress 网站。最近我发现该图像使用卷来存储 MySQL 数据。

所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个镜像,然后删除容器,并从提交的镜像创建一个新容器。但是,如果我这样做,该卷将被删除,并且我的所有数据都将消失。

必须有一些简单的方法来备份我的容器及其卷数据,但我在任何地方都找不到它。

原文由 pguardiario 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
1 个回答

如果我想恢复容器,我可以尝试提交一个图像,然后删除容器,并从提交的图像创建一个新容器。但是,如果我这样做,该卷将被删除并且我的所有数据都消失了

正如 docker 用户指南所解释的, 数据卷 旨在将数据保存在容器文件系统之外。这也简化了多个容器之间的数据共享。

虽然 Docker 永远不会删除卷中的数据(除非您使用 docker rm -v 删除关联的容器),但未被任何 docker 容器引用的卷称为 _悬空卷_。那些 悬空的卷 很难摆脱也很难访问。

这意味着一旦使用卷的最后一个容器被删除,数据卷就会变得悬空并且其内容难以访问。

为了防止那些悬空的卷,诀窍是使用要保留的数据卷创建一个额外的 docker 容器,以便始终至少有该 docker 容器引用该卷。这样,您可以删除运行 wordpress 应用程序的 docker 容器,而不会失去访问该数据卷内容的便利性。

这样的容器称为 数据卷容器

必须有一些简单的方法来备份我的容器和卷数据,但我在任何地方都找不到。

备份 docker 镜像

要备份 docker 映像,请使用 docker save 命令,该命令将生成一个 tar 存档,以后可以使用 docker load 命令创建一个新的 docker 映像。

备份 docker 容器

您可以通过不同的方式备份 docker 容器

  • 通过使用 docker commit 命令根据 docker 容器当前状态提交新的 docker 映像
  • 通过使用 docker export 命令将 docker 容器文件系统导出为 tar 存档。您可以稍后使用 docker import 命令从该 tar 存档创建新的 docker 映像。

请注意,这些命令只会备份 docker 容器分层文件系统。 这不包括数据量

备份 docker 数据卷

要备份数据卷,您可以使用要备份的卷运行新容器并执行 tar 命令以生成卷内容的存档,如 docker 用户指南 中所述。

在您的特定情况下,数据卷用于存储 MySQL 服务器的数据。因此,如果要为此卷导出 tar 存档,则需要先停止 MySQL 服务器。为此,您必须停止 wordpress 容器。

备份 MySQL 数据

另一种方法是远程连接到 MySQL 服务器以使用 mysqldump 命令生成数据库转储。但是,为了使其工作,您的 MySQL 服务器必须配置为接受远程连接,并且还有一个允许远程连接的用户。您正在使用的 wordpress docker 映像可能不是这种情况。


编辑

Docker 最近引入了 Docker 卷插件,允许将卷的处理委托给供应商实现的插件。

docker run 命令具有 -v 选项的新行为。现在可以给它传递一个 _卷名_。以这种方式创建的卷被 命名 并且以后易于引用,从而缓解了 悬空卷 的问题。

编辑 2

Docker 引入了 docker volume prune 命令来轻松删除所有悬空卷。

原文由 Thomasleveil 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题