大家好,这里是Cherry,喜爱折腾、玩数码,热衷于分享自己的数码玩耍经验~
折腾了数十款NAS和数百个Docker容器项目,关注我,每日获得docker玩法
前言
最近,我在重新整理家里的NAS,打算把原来分散的容器服务迁移到性能更强劲的极空间私有云中,满足存储、服务、计算的分离,提高实现设备性能的利用率。
在迁移过程中,我发现有一些早期部署的容器项目,使用的是docker volume来存储数据,而不是Bind映射模式。这让我不得不感慨自己运气真好,没有遇到硬盘损坏数据无法恢复的事件,不然我这些从不备份的卷数据肯定早就丢了。
为了避免后续数据丢失的风险,我决定利用极空间私有云,做好docker volume数据的定时备份,继续加强数据安全的“3-2-1”原则。
点我转跳--->:NAS新手向,数据备份“3-2-1”原则应该怎么做?极空间私有云备份指南
⭐关于极空间私有云数据安全“3-2-1”怎么做,感兴趣的朋友可以阅读我的上一篇专题文章。
今天,我们要介绍的工具叫docker-volume-backupDocker,它是一款轻量级的Docker配套容器,支持将Docker卷定器或一次性备份到本地目录、S3、WebDAV、Azure Blob、Dropbox 、SSH兼容存储中,并轮换使用旧备份(如果已配置)。它还支持多种对称/非对称加密备份,支持消息通知。
一、docker数据存储的两种方法
Docker 在存储数据资料的时候,提供了两种存储方式。
■第一种: 是我们常用的Bind模式,将容器内的装载路径映射到NAS里,让我们可以在NAS文件管理页面直接访问和修改。

可以在极空间的文件管理里直接对容器内容进行增、删、改。

■第二种: docker提供的卷模式(Docker Volume),通过自动生成一个存储路径来绑定容器内部路径。卷模式支持使用docker cli指令来进行复制、迁移、删除等,但是想要访问卷文件内部的资料,就不如bind模式方便。

通过指令【docker volume list】可以查看NAS里所有的卷。

通过指令【docker volume inspect 卷ID】可以查看卷的真实路径,这个路径我们在NAS前端是看不到的,只能通过SSH进行操作。因此我们使用NAS自带的备份和同步工具,也没办法备份这些数据。
所以,我们今天的目的,就是需要通过部署容器项目,来实现数据卷的定时备份和管理。

二、极空间配置WebDav/SFTP/本地目录
1、极空间打开SSH(可选)
在本文教程中,极空间是作为存储仓库而存在的,我们的主要目的是为了将其它docker容器的数据可以定时备份到极空间中。
当然,并不是说极空间本身不支持备份docker 卷,而是因为极空间目前支持将所有容器路径装载为bind模式,基本上用不到容器卷。如果我们的确想要将极空间自身的容器卷也备份的话,则需要打开极空间的SSH功能进行操作。
⭐注意,打开SSH意味着你知道哪些可以做,哪些不可以做,必须对linux和极空间zos系统有深度的认识,否则会造成无法评估的后果!此外,开启极空间SSH功能,意味着会暂时失去官方技术支持(重置系统后可恢复)!!

2、极空间创建备份仓库
首先,我们要先预创建一个存储路径,比如SATA存储14/volumeback
,这个目录用来存储未来的docker volume备份文件。

接着,在系统设置——文件及共享服务中,打开WebDav和SFTP的开关。WebDav默认使用5005(http),5006(https)端口;SFTP默认使用2002端口。

三、备份Docker 卷数据
1、环境变量解析
完整的备份环境变量,比如S3\Dropbox等可以看下面的配置文件。我这里重点挑选极空间私有云本身可以提供的服务,比如webdav、local等介绍。
对于非极空间私有云的容器备份,建议大家选择webdav方法;而极空间自身的容器备份,直接选择本地存储即可。
#-----------------以下为WebDav备份----------------
# 极空间WEBDAV地址
# WEBDAV_URL="http://192.168.0.129:5055"
# 极空间WEBDAV路径
# WEBDAV_PATH="/sata14-15011111111/volumeback"
# 极空间账号、密码
# WEBDAV_USERNAME="15011111111"
# WEBDAV_PASSWORD="123456789"
# 禁用SSL证书验证
# WEBDAV_URL_INSECURE="false"
#-----------------以下为SFTP备份----------------
# 极空间SSH地址
# SSH_HOST_NAME="192.168.0.129"
# 极空间SSH端口
# SSH_PORT="2022"
# 极空间存储真实路径
# SSH_REMOTE_PATH="/sata14-15011111111/volumeback"
# 极空间账号、密码
# SSH_USER="15011111111"
# SSH_PASSWORD="123456789"
# SSH密钥存放位置
# SSH_IDENTITY_FILE="/root/.ssh/id_rsa"
# SSH密钥
# SSH_IDENTITY_PASSPHRASE=""
#-----------------以下为备份加密规则----------------
# 加密选项互斥,只能选择一种方式。
# 对称加密(GPG密码)
# GPG_PASSPHRASE=""
# 非对称加密(GPG公钥环,多行值可用管道符)
# GPG_PUBLIC_KEY_RING=""
# 对称加密(age密码)
# AGE_PASSPHRASE=""
# 非对称加密(age公钥,逗号分隔多个密钥,支持age和ssh密钥)
# AGE_PUBLIC_KEYS=""
#-----------------以下为定时清理规则----------------
# 保留最近N天的备份(0或正整数启用,-1禁用)
# BACKUP_RETENTION_DAYS="-1"
# 清理操作时间缓冲(防止备份时长波动导致误删),s(秒)、m(分)、h(小时)。
# BACKUP_PRUNING_LEEWAY="1h"
#-----------------备份计划----------------
# 支持cron格式。若未设置值,默认每天午夜运行。
# BACKUP_CRON_EXPRESSION="@daily"
# 存储本地备份时,再创建一个最新备份的硬链接。
# BACKUP_LATEST_SYMLINK="backup.latest.tar.gz"
2、备份方法
首先,为了确保数据备份的完整性,我们需要停止待备份的容器! 接着通过SSH工具访问不同的Linux系统后台,完善并执行下面的Docker Cli就可以进行卷数据备份。
🔻以WebDav为例,运行的时候删掉复制成一行,用空格间隔。
docker run --name=backup \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v 待备份卷名1:/backup/data1 \
-v 待备份卷名2:/backup/data2 \
-v /本地备份路径:/archive \
-e BACKUP_CRON_EXPRESSION="@daily" \
-e WEBDAV_URL="http://192.168.0.129:5055" \
-e WEBDAV_PATH="/sata14-15011111111/volumeback" \
-e WEBDAV_USERNAME="15011111111" \
-e WEBDAV_PASSWORD="123456789" \
--entrypoint backup \
offen/docker-volume-backup:v2.43.2
🔻以本地目录/local/data
备份为例,运行的时候删掉复制成一行,用空格间隔。
docker run --name=backup \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v 待备份卷名1:/backup/data1 \
-v 待备份卷名2:/backup/data2 \
-v /local/data:/archive \
-e BACKUP_CRON_EXPRESSION="@daily" \
--entrypoint backup \
offen/docker-volume-backup:v2.43.2
执行结果反馈,可以看到数据传输日志。逻辑基本上是先复制一个目标卷的备份,并映射到容器内,然后将其压缩为tar格式。接着通过webdav、s3、dropbox、local等方式将压缩包同步到备份仓库中。

如图,我将其它NAS里的容器卷,通过webdav成功备份到了极空间文件里。

3、数据还原方法
1️⃣从备份还原卷:
1、解压备份包
tar -C /tmp -xvf backup.tar.gz
2、创建一个临时容器
docker run -d --name temp -v 卷名:/backup_restore alpine
3、将解压的数据包复制到卷中
docker cp /path/解压的文件 temp:/backup_restore
4、停止并删除临时容器
docker stop temp && docker rm temp
2️⃣还原历史版本:
1、停止需要还原数据的容器
docker stop 容器A
2、删除现在的卷
docker volume rm 卷名
3、创建同名的新卷并还原快照
docker run --rm -it -v 卷名:/backup/data1 -v /local/data:/archive:ro alpine tar -xvzf /archive/备份文件.tar.gz
4、重新启动容器
docker start 容器A
总结
在我们日常NAS的使用过程中,除了文档资料需要备份外,NAS里各式各样的虚拟机、容器数据也建议大家定期进行备份。
尤其在数据价值越来越贵的年代,养成个人数据备份的好习惯,远远比购买昂贵的硬盘来做Raid、做同步性价比要高得多,而且实用的多。
本文通过极空间提供的webdav、local、sftp/ssh服务,实现了所有设备的容器数据定时备份,让极空间私有云可以真正发挥存储中心的作用,满足海量数据存储的需求。