我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。

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

一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。


当前回答

我知道这是旧的,但我意识到没有一个良好的文档解决方案,以推动一个数据容器(作为备份)到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

这是它。

我很惊讶没有关于这项工作的文档。我希望有人觉得这有帮助。我知道我花了很长时间来考虑这个问题。

其他回答

如果你只需要备份挂载的卷,你可以从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镜像'重新加载它,并将两者链接在一起。但是这个解决方案似乎很笨拙,而且不可持续和维护-您需要创建一个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桶包含相关数据

我一直在使用这个批处理脚本备份我所有的卷。该脚本将容器名称作为唯一参数,并自动查找其所有已挂载的卷。

然后它为每个卷创建一个tar存档。

#! /bin/bash

container=$1
dirname="backup-$container-$(date +"%FT%H%M%z")"

mkdir $dirname
cd $dirname

volume_paths=( $(docker inspect $container | jq '.[] | .Mounts[].Name, .Mounts[].Source') )

volume_count=$(( ${#volume_paths[@]} / 2 ))

for i in $(seq $volume_count); do

    volume_name=${volume_paths[i-1]}
    volume_name=$(echo $volume_name | tr -d '"')

    volume_path=${volume_paths[(i-1)+volume_count]}
    volume_path=$(echo $volume_path | tr -d '"')
    echo "$volume_name : $volume_path"

    # create an archive with volume name
    tar -zcvf "$volume_name.tar" $volume_path

done

该代码可在Github上获得。

这是一种卷-文件夹-备份的方式。 如果你有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"

运行使用此卷文件夹的映像。 您可以轻松地制作一个映像,其中既有一个运行映像,也有一个卷压缩文件。 但是我不推荐因为各种原因(图像大小,输入命令,..)。

下面的命令将在一个装载了所有命名数据卷的容器中运行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