我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
我建议使用静息胶。这是一个易于使用的备份应用程序,可以备份到各种目标,例如本地文件系统、S3兼容存储服务或静态REST目标服务器。使用resticker,您将有一个已经准备好的容器,可以使用cron语法调度:https://github.com/djmaze/resticker
对于那些想要了解更多关于restic和它的用法的人,我确实写了一个关于这个主题的系列博客文章,包括它的用法示例: https://remo-hoeppli.medium.com/restic-backup-i-simple-and-beautiful-backups-bdbbc178669d
其他回答
如果您的项目使用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/中的命令来创建这种方法。
问题:你想备份你的镜像容器中的数据卷,但这个选项不是开箱即用的,直接和平凡的方式将复制卷路径和备份docker镜像'重新加载它,并将两者链接在一起。但是这个解决方案似乎很笨拙,而且不可持续和维护-您需要创建一个cron作业,以便每次都能进行此流程。
解决方案:使用dockup - Docker镜像备份Docker容器卷,并将其上传到s3 (Docker + backup = dockup)。dockup将使用您的AWS凭据根据环境变量创建一个具有名称的新桶,获得配置的卷,并将被压缩、gzip、时间戳并上传到S3桶。
步骤:
配置docker-compose。数据应该上传到一个专用的安全s3桶,并准备在DRP执行时重新加载。为了验证要配置哪个卷路径,运行docker inspect <service-name>并定位卷:
“卷”:{ “/ etc /服务示例”:{}, “/服务示例”:{} },
编辑配置文件env.txt的内容,并将其放在项目路径下: AWS_ACCESS_KEY_ID = < key_here > AWS_SECRET_ACCESS_KEY = < secret_here > AWS_DEFAULT_REGION = us-east-1 BACKUP_NAME = service-backup PATHS_TO_BACKUP = / etc /服务示例/服务示例 S3_BUCKET_NAME = docker-backups.example.com 恢复= false 运行docup容器
$ docker运行——rm \ ——env-file ——volume -from <service-name> \ ——name dockup tutum/dockup:latest
然后验证s3桶包含相关数据
我知道这是旧的,但我意识到没有一个良好的文档解决方案,以推动一个数据容器(作为备份)到docker中心。我刚刚发布了一个简短的例子,说明如何在 https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub
以下是底线
docker教程建议您可以在本地备份和恢复数据卷。我们将使用这种技术,添加更多的行来将这个备份推入docker中心,以便将来轻松恢复到我们想要的任何位置。那么,让我们开始吧。以下是需要遵循的步骤:
从名为data-container-to- Backup的数据容器备份数据卷
docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup
将这个tar文件展开到一个新的容器中,这样我们就可以将它作为映像的一部分提交
docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"
提交并推送带有所需标签($VERSION)的图像
docker commit data-backup repo/data-backup:$VERSION
docker push repo/data-backup:$VERSION
最后,让我们清理一下
docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)
现在,在我们的repo中有一个名为data-backup的映像,它只是一个包含备份文件和文件夹的文件系统。为了使用这个映像(又名从备份恢复),我们执行以下操作:
使用数据备份映像运行数据容器
run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}
使用数据容器中的卷运行whatEver映像
docker run --volumes-from=data-container repo/whatEver
这是它。
我很惊讶没有关于这项工作的文档。我希望有人觉得这有帮助。我知道我花了很长时间来考虑这个问题。
这是一种卷-文件夹-备份的方式。 如果你有docker注册表基础,这个方法是非常有用的。 这使用docker注册表轻松移动zip文件。
#volume folder backup script. !/bin/bash
#common bash variables. set these variable before running scripts
REPO=harbor.otcysk.org:20443/levee
VFOLDER=/data/mariadb
TAG=mariadb1
#zip local folder for volume files
tar cvfz volume-backup.tar.gz $VFOLDER
#copy the zip file to volume-backup container.
#zip file must be in current folder.
docker run -d -v $(pwd):/temp --name volume-backup ubuntu \
bash -c "cd / && cp /temp/volume-backup.tar.gz ."
#commit for pushing into REPO
docker commit volume-backup $REPO/volume-backup:$TAG
#check gz files in this container
#docker run --rm -it --entrypoint bash --name check-volume-backup \
$REPO/volume-backup:$TAG
#push into REPO
docker push $REPO/volume-backup:$TAG
在另一个服务器上
#pull the image in another server
docker pull $REPO/volume-backup:$TAG
#restore files in another server filesystem
docker run --rm -v $VFOLDER:$VFOLDER --name volume-backup $REPO/volume-backup:$TAG \
bash -c "cd / && tar xvfz volume-backup.tar.gz"
运行使用此卷文件夹的映像。 您可以轻松地制作一个映像,其中既有一个运行映像,也有一个卷压缩文件。 但是我不推荐因为各种原因(图像大小,输入命令,..)。
如果您喜欢从命令行输入神秘的操作符,那么您会喜欢这些手动容器备份技术。请记住,还有一种更快、更有效的备份容器的方法。我在这里写了说明: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支持提供了查看备份、创建实例备份和创建服务器备份的说明。