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

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

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


当前回答

如果您喜欢从命令行输入神秘的操作符,那么您会喜欢这些手动容器备份技术。请记住,还有一种更快、更有效的备份容器的方法。我在这里写了说明:https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus

步骤1:添加Docker主机到任意云 正如Morpheus支持网站上的教程所解释的那样,您可以在几秒钟内将Docker主机添加到您所选择的云。从Morpheus主导航栏上选择Infrastructure开始。在“基础设施”窗口顶部选择“主机”,然后单击右上方的“+容器主机”按钮。

要通过Morpheus将Docker主机备份到云,请导航到基础设施屏幕并打开“+容器主机”菜单。

在菜单中选择容器主机类型,选择一个组,然后在“名称”、“描述”、“可见性”、“选择一个云”和“输入标签”(可选)五个字段中输入数据。单击“下一步”,选择业务规划,配置主机选项。请注意,只有当您选择的计划启用了自定义选项时,Volume、Memory和CPU计数字段才可见。

在这里,您可以添加和调整卷,设置内存大小和CPU计数,并选择网络。您还可以配置操作系统的用户名和密码、域名和主机名(默认为前面输入的容器名)。单击Next,然后添加任何自动化工作流(可选)。最后,检查您的设置并单击Complete保存它们。

步骤2:将Docker注册表集成添加到公有云或私有云 Adam Hicks在Morpheus的另一个教程中描述了与私有Docker Registry集成是多么简单。(使用公共Docker API使用Morpheus提供Docker公共中心的映像不需要额外配置。)

在主导航栏的Admin选项卡下选择Integration,然后选择屏幕右侧的“+New Integration”按钮。在出现的Integration窗口中,在Type下拉菜单中选择Docker Repository,输入名称并添加私有注册中心API端点。为正在使用的注册表提供用户名和密码,然后单击Save Changes按钮。

通过Morpheus“New Integration”对话框将Docker Registry与私有云集成。

要提供您刚刚创建的集成,请在创建实例对话框的“类型”下选择Docker,在“配置”选项卡下的“Docker注册表”下拉菜单中选择注册表,然后继续提供任何Docker容器。

步骤3:管理备份 一旦您添加了Docker主机并集成了注册表,就会为您提供的每个实例自动配置和执行备份。Morpheus支持提供了查看备份、创建实例备份和创建服务器备份的说明。

其他回答

这是一种卷-文件夹-备份的方式。 如果你有docker注册表基础,这个方法是非常有用的。 这使用docker注册表轻松移动zip文件。

#volume folder backup script. !/bin/bash

#common bash variables. set these variable before running scripts
REPO=harbor.otcysk.org:20443/levee
VFOLDER=/data/mariadb
TAG=mariadb1

#zip local folder for volume files
tar cvfz volume-backup.tar.gz $VFOLDER

#copy the zip file to volume-backup container.
#zip file must be in current folder.
docker run -d -v $(pwd):/temp --name volume-backup ubuntu \
       bash -c "cd / && cp /temp/volume-backup.tar.gz ."


#commit for pushing into REPO
docker commit volume-backup $REPO/volume-backup:$TAG

#check gz files in this container
#docker run --rm -it --entrypoint bash --name check-volume-backup \
        $REPO/volume-backup:$TAG

#push into REPO
docker push $REPO/volume-backup:$TAG

在另一个服务器上

#pull the image in another server
docker pull $REPO/volume-backup:$TAG

#restore files in another server filesystem
docker run --rm -v $VFOLDER:$VFOLDER --name volume-backup $REPO/volume-backup:$TAG \
       bash -c "cd / && tar xvfz volume-backup.tar.gz"

运行使用此卷文件夹的映像。 您可以轻松地制作一个映像,其中既有一个运行映像,也有一个卷压缩文件。 但是我不推荐因为各种原因(图像大小,输入命令,..)。

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

我一直在使用这个批处理脚本备份我所有的卷。该脚本将容器名称作为唯一参数,并自动查找其所有已挂载的卷。

然后它为每个卷创建一个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上获得。

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

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

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

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

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

如果你想要一个完整的备份,你需要执行以下几个步骤:

将容器提交给一个映像 保存图像 通过在容器中创建卷的挂载点的tar文件来备份容器的卷。 对数据库容器也重复步骤1-3。

需要注意的是,Docker仅仅将容器提交给镜像,并不包括附加到容器的卷(参考:Docker提交文档)。

提交操作将不包括容器内挂载的卷中包含的任何数据。