我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
docker container run --rm --volumes-from your_db_container -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /your_named_volume
Run创建新的容器
——rm选项在执行tar CVF /backup/backup.tar /dbdata命令后删除容器
——volumes-from从你在your_db_container中创建的卷中创建一个命名的卷(your_named_volume)
-v $(pwd):/backup在当前主机目录($(pwd))和新容器中的/backup目录之间创建一个绑定挂载
Tar CVF /backup/backup. Tar /your_named_volume创建归档文件
源:备份卷
其他回答
如果我想恢复容器,我可以尝试提交一个图像,然后删除容器,并从提交的图像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了
正如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命令,可以轻松删除所有悬挂卷。
如果你只需要备份挂载的卷,你可以从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
我知道这是旧的,但我意识到没有一个良好的文档解决方案,以推动一个数据容器(作为备份)到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镜像'重新加载它,并将两者链接在一起。但是这个解决方案似乎很笨拙,而且不可持续和维护-您需要创建一个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桶包含相关数据
我建议使用静息胶。这是一个易于使用的备份应用程序,可以备份到各种目标,例如本地文件系统、S3兼容存储服务或静态REST目标服务器。使用resticker,您将有一个已经准备好的容器,可以使用cron语法调度:https://github.com/djmaze/resticker
对于那些想要了解更多关于restic和它的用法的人,我确实写了一个关于这个主题的系列博客文章,包括它的用法示例: https://remo-hoeppli.medium.com/restic-backup-i-simple-and-beautiful-backups-bdbbc178669d