我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
我一直在用这个Docker-image教程/wordpress演示一个wordpress网站。最近我发现映像使用卷作为mysql数据。
所以问题是这样的:如果我想备份和恢复容器,我可以尝试提交一个映像,然后删除该容器,并从已提交的映像创建一个新容器。但如果我这样做,卷就会被删除,所有的数据都消失了。
一定有一些简单的方法来备份我的容器及其卷数据,但我到处都找不到它。
当前回答
如果你的情况和我的一样简单,你可以这样做:
创建一个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云中,您的用户将直接在他们的容器上获得可用的数据
其他回答
如果你的情况和我的一样简单,你可以这样做:
创建一个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云中,您的用户将直接在他们的容器上获得可用的数据
docker container run --rm --volumes-from your_db_container -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /your_named_volume
Run创建新的容器
——rm选项在执行tar CVF /backup/backup.tar /dbdata命令后删除容器
——volumes-from从你在your_db_container中创建的卷中创建一个命名的卷(your_named_volume)
-v $(pwd):/backup在当前主机目录($(pwd))和新容器中的/backup目录之间创建一个绑定挂载
Tar CVF /backup/backup. Tar /your_named_volume创建归档文件
源:备份卷
如果你想要一个完整的备份,你需要执行以下几个步骤:
将容器提交给一个映像 保存图像 通过在容器中创建卷的挂载点的tar文件来备份容器的卷。 对数据库容器也重复步骤1-3。
需要注意的是,Docker仅仅将容器提交给镜像,并不包括附加到容器的卷(参考:Docker提交文档)。
提交操作将不包括容器内挂载的卷中包含的任何数据。
如果您的项目使用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/中的命令来创建这种方法。
我建议使用静息胶。这是一个易于使用的备份应用程序,可以备份到各种目标,例如本地文件系统、S3兼容存储服务或静态REST目标服务器。使用resticker,您将有一个已经准备好的容器,可以使用cron语法调度:https://github.com/djmaze/resticker
对于那些想要了解更多关于restic和它的用法的人,我确实写了一个关于这个主题的系列博客文章,包括它的用法示例: https://remo-hoeppli.medium.com/restic-backup-i-simple-and-beautiful-backups-bdbbc178669d