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

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

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


当前回答

问题:你想备份你的镜像容器中的数据卷,但这个选项不是开箱即用的,直接和平凡的方式将复制卷路径和备份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上获得。

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

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

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

问题:你想备份你的镜像容器中的数据卷,但这个选项不是开箱即用的,直接和平凡的方式将复制卷路径和备份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桶包含相关数据

如果你的情况和我的一样简单,你可以这样做:

创建一个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云中,您的用户将直接在他们的容器上获得可用的数据