我一直在使用这个Docker-image tutum/wordpress来演示一个Wordpress网站。最近我发现镜像使用卷存储MySQL-data。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除容器,并从提交的映像创建一个新的容器。但如果我这样做了,卷就会被删除,我所有的数据都会消失。
肯定有一些简单的方法来备份我的容器及其卷数据,但我在任何地方都找不到它。
发布于 2014-10-13 20:18:35
如果我想还原容器,我可以尝试提交一个镜像,然后删除该容器,并从提交的镜像创建一个新的容器。但如果我这样做了,卷就会被删除,我所有的数据都会消失
正如docker用户指南所解释的那样,data volumes旨在将数据持久化到容器文件系统之外。这也简化了多个容器之间的数据共享。
虽然Docker永远不会删除卷中的数据(除非您使用docker rm -v删除关联的容器),但没有被任何docker容器引用的卷称为悬挂卷。这些悬而未决的卷很难摆脱,也很难访问。
这意味着一旦删除了使用卷的最后一个容器,数据卷就会变得悬空,其内容很难访问。
为了防止这些悬空卷,诀窍是使用您想要持久存储的数据卷创建一个额外的docker容器,以便始终至少有该docker容器引用该卷。通过这种方式,您可以删除运行wordpress应用程序的docker容器,而不会失去访问该数据卷内容的便利性。
这样的容器称为data volume containers。
肯定有一些简单的方法来备份我的容器和卷数据,但是我到处都找不到它。
备份坞站映像
要备份docker映像,请使用docker save命令,该命令将生成一个tar归档文件,稍后可使用docker load命令创建新的docker映像。
后备码头容器
您可以通过不同的方式备份docker容器
请注意,这些命令将仅备份docker容器分层文件系统。此选项不包括数据卷。
备份docker数据卷
要备份数据卷,您可以使用要备份的卷运行一个新容器,并执行tar命令来生成卷内容的存档,如docker user guide中所述。
在您的特定情况下,数据卷用于存储MySQL服务器的数据。因此,如果您想要导出此卷的tar归档,则需要首先停止MySQL服务器。为此,您必须停止wordpress容器。
备份MySQL数据
另一种方法是使用mysqldump命令远程连接到MySQL服务器以生成数据库转储。但是,为了使其正常工作,您的MySQL服务器必须配置为接受远程连接,并且还必须有一个允许远程连接的用户。你正在使用的wordpress docker镜像可能不是这样的。
编辑
Docker最近推出了,它允许将卷的处理委托给供应商实现的插件。
对于-v选项,docker run命令具有新的行为。现在可以向它传递卷名。以这种方式创建的卷被命名,便于以后引用,从而缓解了悬空卷的问题。
编辑2
Docker引入了docker volume prune命令来轻松删除所有悬空的卷。
发布于 2014-10-13 20:19:53
更新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_NAME=$2
usage() {
echo "Usage: $0 [container name] [volume name]"
exit 1
}
if [ -z $CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
if [ -z $VOLUME_NAME ]
then
echo "Error: missing volume name parameter."
usage
fi
sudo docker run --rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME原始单卷恢复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和:
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或者你可以遵循官方的方式:
发布于 2016-03-10 22:55:12
如果您只需要备份已安装的卷,则只需从Dockerhost复制文件夹。
注意:如果你使用的是Ubuntu,Dockerhost就是你的本地机器。如果你使用的是Dockerhost Mac,那么Dockerhost就是你的虚拟机。
Ubuntu上的
您可以在以下位置找到所有包含卷的文件夹:/var/lib/docker/volumes/,这样您就可以将它们复制并归档到您想要的任何位置。
MAC上的
这并不像在Ubuntu上那么简单。您需要从VM复制文件。
这是一个脚本,说明如何从虚拟机(运行Docker服务器的位置)将所有包含卷的文件夹复制到本地计算机。我们假设您的扩展底座VM名为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 lshttps://stackoverflow.com/questions/26331651
复制相似问题