我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
如果你想要一个完整的备份,你需要执行以下几个步骤:
将容器提交给一个映像 保存图像 通过在容器中创建卷的挂载点的tar文件来备份容器的卷。 对数据库容器也重复步骤1-3。
需要注意的是,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
如果你只需要备份挂载的卷,你可以从Dockerhost复制文件夹。
注意:如果你使用的是Ubuntu, Dockerhost就是你的本地机器。如果你在Mac上,Dockerhost就是你的虚拟机。
在Ubuntu上
你可以在这里找到所有带卷的文件夹:/var/lib/docker/volumes/所以你可以复制它们并在任何你想要的地方存档。
在MAC
它不像Ubuntu那么简单。需要从虚拟机中拷贝文件。
下面是如何从虚拟机(Docker服务器运行的地方)复制所有带卷的文件夹到本地机器的脚本。我们假设您的docker-machine虚拟机名为default。
docker-machine ssh default sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes
docker-machine ssh default sudo chmod -R 777 /home/docker/volumes
docker-machine scp -R default:/home/docker/volumes ./backup_volumes
docker-machine ssh default sudo rm -r /home/docker/volumes
它将在当前目录中创建一个文件夹。/backup_volumes,并将所有卷复制到该文件夹中。
下面是一个脚本,演示如何将所有保存的卷从本地目录(./backup_volumes)复制到Dockerhost机器
docker-machine scp -r ./backup_volumes default:/home/docker
docker-machine ssh default sudo mv -f /home/docker/backup_volumes /home/docker/volumes
docker-machine ssh default sudo chmod -R 777 /home/docker/volumes
docker-machine ssh default sudo cp -v -R /home/docker/volumes /var/lib/docker/
docker-machine ssh default sudo rm -r /home/docker/volumes
现在你可以检查它是否工作:
docker volume ls
如果您喜欢从命令行输入神秘的操作符,那么您会喜欢这些手动容器备份技术。请记住,还有一种更快、更有效的备份容器的方法。我在这里写了说明: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支持提供了查看备份、创建实例备份和创建服务器备份的说明。
如果你只是需要一个简单的备份文件,你可以试试我的小工具: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
如果您的项目使用docker-compose,这里有一种备份和恢复卷的方法。
docker-compose.yml
基本上,您可以在docker-compose中添加db-backup和db-restore服务。Yml文件,并将其改编为卷的名称。在本例中,我的卷名为dbdata。
version: "3"
services:
db:
image: percona:5.7
volumes:
- dbdata:/var/lib/mysql
db-backup:
image: alpine
tty: false
environment:
- TARGET=dbdata
volumes:
- ./backup:/backup
- dbdata:/volume
command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"
db-restore:
image: alpine
environment:
- SOURCE=dbdata
volumes:
- ./backup:/backup
- dbdata:/volume
command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"
避免腐败
为了保持数据一致性,在备份或恢复之前停止db容器
docker-compose stop db
备份
备份到默认目标(backup/dbdata.tar.bz2):
docker-compose run --rm db-backup
或者,如果你想指定另一个目标名称,请执行以下操作:
docker-compose run --rm -e TARGET=mybackup db-backup
恢复
从backup/dbdata.tar进行恢复。bz2,获取:
docker-compose run --rm db-restore
或从特定文件恢复使用:
docker-compose run --rm -e SOURCE=mybackup db-restore
我改编了https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/中的命令来创建这种方法。