自动备份Docker存储至飞牛本地
1. 功能概述
- 停用docker,打包docker目录并加密存储,自动清理旧备份
- 飞牛os定时拉取备份进行本地存储,并定期清理旧备份
2. 服务器端操作
2.1 安装 7-Zip
apt update && apt install p7zip-full -y2.2 创建打包脚本
编辑脚本文件:
vim /root/docker_backup.sh示例脚本内容:
#!/bin/bash
DOCKER_ROOT="/docker" # Docker 根目录
OUTPUT_DIR="/docker_backup" # 备份输出目录
BACKUP_PASS="xxxx" # 7z 解压密码
DATE=$(date +%Y%m%d)
FILE_NAME="docker_bak_$DATE.7z"
# 创建备份目录
mkdir -p $OUTPUT_DIR
# 1. 停止容器(保证数据库和笔记文件不再写入)
echo "Stopping all containers..."
RUNNING=$(docker ps -q)
if [ -n "$RUNNING" ]; then
docker stop $RUNNING
fi
# 2. 7z 加密打包
# -p: 指定密码
# -mhe=on: 文件名加密
# -mx=3: 压缩级别(1-9,建议3或5)
# -y: 自动确认
echo "Packing and Encrypting with 7-Zip..."
7z a -p"$BACKUP_PASS" -mhe=on -mx=3 -y $OUTPUT_DIR/$FILE_NAME $DOCKER_ROOT
# 3. 启动容器
echo "Starting containers..."
if [ -n "$RUNNING" ]; then
docker start $RUNNING
fi
# 4. 清理 3 天前的旧备份
echo "Cleaning old backups..."
find $OUTPUT_DIR -type f -mtime +3 -delete
echo "Backup Task Completed: $FILE_NAME"2.3 设置定时任务
每天凌晨 4 点自动执行备份脚本:
0 4 * * * /bin/bash /root/docker_backup.sh >> /root/docker_backup.log 2>&13. 仓储端(飞牛 OS)
3.1 生成密钥对(仅需一次)
在飞牛 OS 终端执行:
ssh-keygen -t ed25519- 一路回车,不设置
passphrase - 生成的密钥位于
/root/.ssh/目录下
3.2 配置服务器信任关系
- 在飞牛 OS 查看公钥内容:
cat /root/.ssh/id_ed25519.pub- 复制完整公钥字符串
- 在服务器上操作,将公钥添加到信任列表:
vim ~/.ssh/authorized_keys将公钥粘贴到文件末尾并保存。
3.3 配置 SSH 别名(飞牛OS端)
编辑配置文件:
vim /root/.ssh/config示例内容:
Host *
IdentityFile ~/.ssh/id_ed25519 # 使用 Ed25519 密钥
Host sg111
HostName 111.119.xxx.xxx
User root
Port 223.4 测试 SSH 免密登录
在飞牛 OS 终端执行:
ssh sg111- 如果无需输入密码即登录,说明免密配置成功。
3.5 飞牛 OS 任务计划自动拉取备份
前提:
- 已生成密钥并配置服务器
authorized_keys - 已在
~/.ssh/config 配置别名sg111 - 已在应用中心安装
任务计划应用
3.6 任务脚本示例
#!/bin/bash
# 设置存放目录
TARGET_DIR="/vol2/1000/home/个人/电子产品/备份文件/docker_backup"
DATE_STR=$(date "+%Y-%m-%d %H:%M:%S")
echo "=========================================="
echo "开始备份任务: $DATE_STR"
echo "目标目录: $TARGET_DIR"
# 1. 进入目录并显示当前状态
cd "$TARGET_DIR" || exit
echo "当前目录文件数: $(ls -1 | wc -l)"
# 2. 拉取最新备份
FILE_NAME="docker_bak_$(date +%Y%m%d).7z"
echo "正在从服务器拉取: $FILE_NAME ..."
# 记录耗时
{ time scp sg111:/docker_backup/$FILE_NAME . ; } 2>&1
# 3. 检查同步结果
if [ -f "$FILE_NAME" ]; then
echo "成功:文件 $FILE_NAME 已同步至本地。"
du -sh "$FILE_NAME"
else
echo "失败:未能在服务器上找到文件或传输中断。"
fi
# 4. 清理 15 天前的旧备份
echo "正在清理 15 天前的旧备份..."
find . -name "docker_bak_*.7z" -mtime +15 -print -delete
echo "任务执行完毕!"
echo "=========================================="
# 列出所有备份文件
ls -lh以上流程实现了 Docker 目录的定期加密备份、自动清理、以及异地安全存储,适用于个人及小型团队的数据保障需求。