提问者:小点点

如何备份Docker-container及其数据卷?


我一直在使用这个Docker-image Tutum/Wordpress来演示一个Wordpress网站。最近,我发现该映像使用了mysql数据的卷。

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

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


共1个答案

匿名用户

如果我想还原容器,我可以尝试提交一个映像,然后删除容器,并从提交的映像创建一个新容器。但如果我这样做了,卷就会被删除,我的所有数据都消失了

正如docker用户指南所解释的那样,数据卷意味着将数据持久化到容器文件系统之外。这也简化了多个容器之间的数据共享。

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

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

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

这样的容器称为数据量容器。

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

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

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

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

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

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

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

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

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

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

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