首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何备份带有数据卷的Docker-container?

如何备份带有数据卷的Docker-container?
EN

Stack Overflow用户
提问于 2014-10-13 09:09:36
回答 16查看 290.9K关注 0票数 217

我一直在使用这个Docker-image tutum/wordpress来演示一个Wordpress网站。最近我发现镜像使用卷存储MySQL-data。

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

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

EN

回答 16

Stack Overflow用户

发布于 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 commit命令
  • 根据停靠容器的当前状态提交新的停靠镜像,使用docker export命令将停靠容器文件系统导出为tar归档。稍后,您可以使用docker import命令从该tar归档文件创建新的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命令来轻松删除所有悬空的卷。

票数 180
EN

Stack Overflow用户

发布于 2014-10-13 20:19:53

更新2

原始单卷备份bash脚本:

代码语言:javascript
复制
#!/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脚本:

代码语言:javascript
复制
#!/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

用法可能如下:

代码语言:javascript
复制
$ 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是否也适用于相同的容器卷,但您可以使用:

代码语言:javascript
复制
sudo docker run --rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

和:

代码语言:javascript
复制
sudo docker run --rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar

结束更新

有一个很好的工具可以让您备份和恢复docker卷容器:

https://github.com/discordianfish/docker-backup

如果您有一个容器链接到一些容器卷,如下所示:

代码语言:javascript
复制
$ docker run --volumes-from=my-data-container --name my-server ...

您可以像这样备份所有卷:

代码语言:javascript
复制
$ docker-backup store my-server-backup.tar my-server

然后像这样恢复:

代码语言:javascript
复制
$ docker-backup restore my-server-backup.tar

或者你可以遵循官方的方式:

How to port data-only volumes from one host to another?

票数 44
EN

Stack Overflow用户

发布于 2016-03-10 22:55:12

如果您只需要备份已安装的卷,则只需从Dockerhost复制文件夹。

注意:如果你使用的是Ubuntu,Dockerhost就是你的本地机器。如果你使用的是Dockerhost Mac,那么Dockerhost就是你的虚拟机。

Ubuntu上的

您可以在以下位置找到所有包含卷的文件夹:/var/lib/docker/volumes/,这样您就可以将它们复制并归档到您想要的任何位置。

MAC上的

这并不像在Ubuntu上那么简单。您需要从VM复制文件。

这是一个脚本,说明如何从虚拟机(运行Docker服务器的位置)将所有包含卷的文件夹复制到本地计算机。我们假设您的扩展底座VM名为default__。

代码语言:javascript
复制
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计算机的脚本

代码语言:javascript
复制
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

现在,您可以通过以下方法检查它是否正常工作:

代码语言:javascript
复制
docker volume ls
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26331651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档