我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
假设您的卷名为data_volume。您可以使用以下命令将卷备份到名为data_image的docker镜像,并从镜像中恢复卷:
备份:
docker run --rm --mount source=data_volume,destination=/data alpine tar -c -f- data | docker run -i --name data_container alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container
恢复:
docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data alpine tar -x -f-
其他回答
我创建了一个工具来编排和启动数据和mysql容器的备份,简单地称为docker-backup。在docker中心上甚至有一个现成的图像。
它主要是用Bash编写的,因为它主要是编制。它在实际的备份引擎上使用了两面性。目前可以备份到FTP(S)和Amazon S3。
配置非常简单:在YAML中编写一个配置文件,描述要备份的内容和位置,然后就完成了!
对于数据容器,它自动挂载由容器共享的卷以备份和处理它。对于mysql容器,它链接它们,并执行一个mysqldump与你的容器捆绑,并处理结果。
我写它是因为我使用Docker- cloud,它不是最新的Docker引擎版本,因为我想拥抱Docker的方式,在我的应用程序容器中不包括任何备份过程。
下面的命令将在一个装载了所有命名数据卷的容器中运行tar,并将输出重定向到一个文件中:
docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` alpine tar -C /mnt -cj . > data-volumes.tar.bz2
确保测试结果存档,以防出现错误:
tar -tjf data-volumes.tar.bz2
如果您喜欢从命令行输入神秘的操作符,那么您会喜欢这些手动容器备份技术。请记住,还有一种更快、更有效的备份容器的方法。我在这里写了说明:https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
步骤1:添加Docker主机到任意云 正如Morpheus支持网站上的教程所解释的那样,您可以在几秒钟内将Docker主机添加到您所选择的云。从Morpheus主导航栏上选择Infrastructure开始。在“基础设施”窗口顶部选择“主机”,然后单击右上方的“+容器主机”按钮。
要通过Morpheus将Docker主机备份到云,请导航到基础设施屏幕并打开“+容器主机”菜单。
在菜单中选择容器主机类型,选择一个组,然后在“名称”、“描述”、“可见性”、“选择一个云”和“输入标签”(可选)五个字段中输入数据。单击“下一步”,选择业务规划,配置主机选项。请注意,只有当您选择的计划启用了自定义选项时,Volume、Memory和CPU计数字段才可见。
在这里,您可以添加和调整卷,设置内存大小和CPU计数,并选择网络。您还可以配置操作系统的用户名和密码、域名和主机名(默认为前面输入的容器名)。单击Next,然后添加任何自动化工作流(可选)。最后,检查您的设置并单击Complete保存它们。
步骤2:将Docker注册表集成添加到公有云或私有云 Adam Hicks在Morpheus的另一个教程中描述了与私有Docker Registry集成是多么简单。(使用公共Docker API使用Morpheus提供Docker公共中心的映像不需要额外配置。)
在主导航栏的Admin选项卡下选择Integration,然后选择屏幕右侧的“+New Integration”按钮。在出现的Integration窗口中,在Type下拉菜单中选择Docker Repository,输入名称并添加私有注册中心API端点。为正在使用的注册表提供用户名和密码,然后单击Save Changes按钮。
通过Morpheus“New Integration”对话框将Docker Registry与私有云集成。
要提供您刚刚创建的集成,请在创建实例对话框的“类型”下选择Docker,在“配置”选项卡下的“Docker注册表”下拉菜单中选择注册表,然后继续提供任何Docker容器。
步骤3:管理备份 一旦您添加了Docker主机并集成了注册表,就会为您提供的每个实例自动配置和执行备份。Morpheus支持提供了查看备份、创建实例备份和创建服务器备份的说明。
如果我想恢复容器,我可以尝试提交一个图像,然后删除容器,并从提交的图像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了
正如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图像的情况。
Edit
Docker最近引入了Docker卷插件,允许将卷的处理委托给供应商实现的插件。
docker run命令对-v选项有一个新的行为。现在可以给它传递一个卷名。以这种方式创建的卷被命名,以后很容易引用,从而缓解了悬空卷的问题。
编辑2
Docker引入了Docker volume prune命令,可以轻松删除所有悬挂卷。
如果你只是需要一个简单的备份文件,你可以试试我的小工具:https://github.com/loomchild/volume-backup
例子
备份:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1
将命名为some_volume的卷归档到/tmp/archive1.tar。Bz2归档文件
恢复:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1
将擦除并恢复/tmp/archive1.tar中名为some_volume的卷。Bz2归档文件。
更多信息:https://medium.com/@loomchild/backup-restore-docker- namedvolumes -350397b8e362