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

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

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


当前回答

如果你只是需要一个简单的备份文件,你可以试试我的小工具: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

其他回答

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

正如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命令,可以轻松删除所有悬挂卷。

我创建了一个工具来编排和启动数据和mysql容器的备份,简单地称为docker-backup。在docker中心上甚至有一个现成的图像。

它主要是用Bash编写的,因为它主要是编制。它在实际的备份引擎上使用了两面性。目前可以备份到FTP(S)和Amazon S3。

配置非常简单:在YAML中编写一个配置文件,描述要备份的内容和位置,然后就完成了!

对于数据容器,它自动挂载由容器共享的卷以备份和处理它。对于mysql容器,它链接它们,并执行一个mysqldump与你的容器捆绑,并处理结果。

我写它是因为我使用Docker- cloud,它不是最新的Docker引擎版本,因为我想拥抱Docker的方式,在我的应用程序容器中不包括任何备份过程。

我建议使用静息胶。这是一个易于使用的备份应用程序,可以备份到各种目标,例如本地文件系统、S3兼容存储服务或静态REST目标服务器。使用resticker,您将有一个已经准备好的容器,可以使用cron语法调度:https://github.com/djmaze/resticker

对于那些想要了解更多关于restic和它的用法的人,我确实写了一个关于这个主题的系列博客文章,包括它的用法示例: https://remo-hoeppli.medium.com/restic-backup-i-simple-and-beautiful-backups-bdbbc178669d

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

这是它。

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

更新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

或者你可以按照官方的方式:

如何将只有数据的卷从一个主机移植到另一个主机?