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

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

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


当前回答

如果您的项目使用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/中的命令来创建这种方法。

其他回答

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

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

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

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

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

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

我们可以使用映像备份所有卷。我写了一个脚本来帮助备份和恢复。此外,我将数据保存到tar文件压缩,以将所有数据保存在本地磁盘上。我使用这个脚本将我的Postgres和Cassandra卷数据库保存在同一个映像上。例如,如果Postgres有pg_data, Cassandra数据库有cassandra_data,我们可以调用下面的脚本两次,一次带有pg_data参数,然后cassandra_data参数

备份脚本:

#! /bin/bash
GENERATE_IMAGE="data_image"
TEMPRORY_CONTAINER_NAME="data_container"
VOLUME_TO_BACKUP=${1}
RANDOM=$(head -200 /dev/urandom | cksum | cut -f1 -d " ")

if docker images | grep -q ${GENERATE_IMAGE};  then
    docker run --rm --mount source=${VOLUME_TO_BACKUP},destination=/${VOLUME_TO_BACKUP} ${GENERATE_IMAGE} tar -c -f- ${VOLUME_TO_BACKUP} | docker run -i --name ${TEMPRORY_CONTAINER_NAME} ${GENERATE_IMAGE} tar -x -f-
else
    docker run --rm --mount source=${VOLUME_TO_BACKUP},destination=/${VOLUME_TO_BACKUP} alpine tar -c -f- ${VOLUME_TO_BACKUP} | docker run -i --name ${TEMPRORY_CONTAINER_NAME} alpine tar -x -f-
fi

docker container commit ${TEMPRORY_CONTAINER_NAME} ${GENERATE_IMAGE}
docker rm ${TEMPRORY_CONTAINER_NAME}

if [ -f "$(pwd)/backup/${VOLUME_TO_BACKUP}.tar" ]; then
    docker run --rm -v $(pwd)/backup:/backup ${GENERATE_IMAGE} tar cvf /backup/${VOLUME_TO_BACKUP}_${RANDOM}.tar /${VOLUME_TO_BACKUP}
else
    docker run --rm -v $(pwd)/backup:/backup ${GENERATE_IMAGE} tar cvf /backup/${VOLUME_TO_BACKUP}.tar /${VOLUME_TO_BACKUP}
fi

例子:

。/ backup.sh cassandra_data 。/ backup.sh pg_data

恢复脚本:

#! /bin/bash
GENERATE_IMAGE="data_image"
TEMPRORY_CONTAINER_NAME="data_container"
VOLUME_TO_RESTORE=${1}

docker run --rm ${GENERATE_IMAGE} tar -c -f- ${VOLUME_TO_RESTORE} | docker run -i --rm --mount source=${VOLUME_TO_RESTORE},destination=/${VOLUME_TO_RESTORE} alpine tar -x -f-

例子:

。/ restore.sh cassandra_data 。/ restore.sh pg_data

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

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

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