我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
如果你的情况和我的一样简单,你可以这样做:
创建一个Dockerfile来扩展容器的基本映像 我假设您的卷已经映射到文件系统,因此您可以使用add文件夹目的地将这些文件/文件夹添加到映像中 完成了!
例如,假设您有来自主目录上的卷的数据,例如在/home/mydata,您可以运行以下命令:
DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate
DOCKERFILE指向这样的文件:
FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <example@gmail.com>
WORKDIR /opt/data
ADD mydata .
其余的东西是从基本映像继承的。现在,您可以将该映像推到docker云中,您的用户将直接在他们的容器上获得可用的数据
其他回答
如果你只需要备份挂载的卷,你可以从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
更新2
原始单卷备份bash脚本:
#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_PATH=$2
usage() {
echo "Usage: $0 [container name] [volume path]"
exit 1
}
if [ -z $CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
if [ -z $VOLUME_PATH ]
then
echo "Error: missing volume path parameter."
usage
fi
sudo docker run --rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_PATH
原始单卷恢复bash脚本:
#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1
usage() {
echo "Usage: $0 [container name]"
exit 1
}
if [ -z $NEW_CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
sudo docker run --rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar
用法可以这样:
$ volume_backup.sh old_container /srv/www
$ sudo docker stop old_container && sudo docker rm old_container
$ sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container
假设:备份文件名为backup.tar,与备份恢复脚本在同一目录下,容器之间的卷名称相同。
更新
在我看来,从容器备份卷与从数据容器备份卷没有什么不同。
卷就是链接到容器的路径,所以过程是一样的。
我不知道docker-backup是否也适用于相同的容器卷,但你可以使用:
sudo docker run --rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
and:
sudo docker run --rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar
最后更新
有一个很好的工具可以让你备份和恢复docker卷容器:
https://github.com/discordianfish/docker-backup
如果你有一个像这样链接到一些容器卷的容器:
$ docker run --volumes-from=my-data-container --name my-server ...
您可以像这样备份所有卷:
$ docker-backup store my-server-backup.tar my-server
然后像这样还原:
$ docker-backup restore my-server-backup.tar
或者你可以按照官方的方式:
如何将只有数据的卷从一个主机移植到另一个主机?
如果您的项目使用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中心。我刚刚发布了一个简短的例子,说明如何在 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
这是它。
我很惊讶没有关于这项工作的文档。我希望有人觉得这有帮助。我知道我花了很长时间来考虑这个问题。
如果你只是需要一个简单的备份文件,你可以试试我的小工具: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