基于Docker标签创建备份
项目描述
Docker卷转储
一个工具,帮助从运行在Docker容器中的容器存档数据。
- 支持Postgresql、Mysql/Mariadb数据库备份:它通过Docker API在容器中创建备份,然后将数据检索到合适的位置保存。
rsync
卷数据:它检查容器并同步所有声明的本地卷
和绑定
挂载点。
注意:目前无法同时备份数据库和同步这些卷。
用法
使用Docker
docker run registry.gitlab.com/micro-entreprise/docker-volume-dump archive --help
例如,如果您想从Docker Swarm环境中的不同postgresql容器创建转储,这看起来可能像这样
docker service create \
-d \
--mode global \
--name pgsql-dumps \
--restart-condition none \
--mount type=bind,src=/path-to-dump-storage/,dst=/backups \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=/path-to-config-directory/,dst=/etc/archiver \
--network sentry_internal \
--with-registry-auth registry.gitlab.com/micro-entreprise/docker-volume-dump \
archive -f /etc/archiver/logging.json -r -s '{"label": ["docker-volume-dump.project='$PROJECT'","docker-volume-dump.environment='$ENVIRONMENT'"]}'
此脚本需要访问Docker守护进程以查询Docker标签。它必须在每个主机上使用--mode global
启动。
使用Python
pip install docker-volume-dump
archive --help
配置
主要思想是告诉容器如何使用Docker标签管理其备份,您可以设置以下标签。
如果您喜欢,可以使用自定义前缀,使用
ARCHIVER_LABEL_PREFIX
环境变量。例如,如果您将ARCHIVER_LABEL_PREFIX=archiver
设置为,则它将期望标签类似于archiver.isactive
而不是默认的docker-volume-dump.isactive
。
-
docker-volume-dump.driver:可选(默认为
pgsql
)要转储的数据类型(可以是pgsql
、mysql
、rsync
之一)。容器只支持一个值。注意:
mysql
驱动程序同样适用于mariadb。 -
docker-volume-dump.isactive:不取值。由默认选择器用于确定容器上是否启用了存档备份。
-
docker-volume-dump.project:项目名称(如果没有设置,则为容器名称)
-
docker-volume-dump.environment:环境(预发布、生产等)
-
docker-volume-dump.prefix:转储文件的名称前缀
数据库标签(pgsql
/mysql
)
- docker-volume-dump.dbname:必需,用于备份的数据库名称。
- docker-volume-dump.username:用于备份数据库的数据库角色。当使用
mysql
时必需,若未设置pgsql
则回退到postgres
。 - docker-volume-dump.password:用于备份数据库的数据库密码。当使用
mysql
时必需,与pgsql
驱动程序不兼容。
这将生成一个类似以下结构的文件:
<项目>/[<环境>/]<前缀><dbname><日期>
rsync
标签
注意:我选择首先使用rsync,因为tar/gzip和rdiff-backup在其他程序同时写入内容时无法压缩数据。我的流程类似于data -> rsync -> rdiff-backup -> tar/gzip -> s3
- docker-volume-dump.rsync-params:添加到rsync命令中的参数。预定义(硬编码)的参数为
rsync -avhP --delete
- docker-volume-dump.ro-volumes:如果设置为以下值之一
["yes", "true", "t", "1"]
(不区分大小写),则将给定容器的只读卷也作为rsync。
将为每个声明的卷/绑定生成一个目录
<项目>/[<环境>/][<前缀>]<计算文件夹名称>
计算文件夹名称基于容器内部的路径,其中斜杠(/
)被替换为连字符(-
)。例如
- 项目:test
- 环境:dev
- 前缀:
rsynced_
- 卷声明为
-v /some/path/on/host/machine:/path/to/data
- 卷声明为
-v named-volume:/other/data
注意:如果归档器在挂载了主机文件系统的容器中运行,请记住使用
--host-fs /hostfs
选项。
将生成
- /backups/test/dev/rsynced_path-to-data
- /backups/test/dev/rsynced_other-data
路线图
- pgsql/mysql:支持每个数据库管理系统多个基础
- pgsql/mysql:如果没有提供dbname,则检索数据库列表以检测要备份的数据库
- 怀疑用来查询Docker标签的方式是否与k8s兼容
- 在swarm中研究仅启动一次容器(而不是在每个主机上)