这套工具包括两个脚本,旨在帮助Docker用户自动化备份和恢复所有运行中容器的Docker卷。这些脚本可以大大简化容器数据管理的过程,适用于需要迁移数据到新服务器或仅仅进行定期备份的场景。

特性

  • 自动识别:自动识别并备份所有运行中的容器挂载的卷。
  • 简易操作:通过简单的命令行操作即可完成备份和恢复。
  • 灵活性:支持备份到指定目录,方便管理和迁移。
  • 通用性:适用于任何使用Docker卷的容器服务。

如何使用

  1. 备份脚本(auto_backup.sh)

    • 功能:自动备份所有运行中容器的挂载卷到指定目录。
    • 使用方法:

      ./auto_backup.sh
    • 结果:脚本会创建一个名为docker-volumes-backups的目录(如果不存在),并将所有运行中容器的卷备份为.tar.gz格式存储在此目录下。
  2. 恢复脚本(auto_restore.sh)

    • 功能:自动从备份文件恢复Docker卷。
    • 使用方法:

      ./auto_restore.sh
    • 注意:确保备份文件位于名为docker-volumes-backups的目录中。脚本会读取此目录下的所有.tar.gz文件,并尝试恢复到对应的Docker卷。

前提条件

  • 需要有Docker环境。
  • 对于Linux用户,需要给予脚本执行权限:

    chmod +x auto_backup.sh
    chmod +x auto_restore.sh

注意事项

  • 在使用恢复脚本之前,请确保目标Docker环境中不存在同名的卷,除非你明确希望覆盖它们。
  • 建议在实际生产环境使用前,先在测试环境中验证脚本的功能。
  • 备份和恢复操作可能会占用相当的时间和资源,具体取决于卷的大小和数量,请在系统负载较低的时段进行操作。

通过这两个脚本,用户可以方便快捷地管理Docker卷的备份和恢复,为数据安全和迁移提供了一种有效的解决方案。分享这些脚本时,请确保提供完整的使用说明,帮助其他人正确地使用它们。

自动备份脚本(auto_backup.sh)

这个脚本会寻找所有运行中的容器,并备份它们挂载的卷到当前目录下。

#!/bin/bash

# 定义备份文件的保存目录
BACKUP_DIR=./docker-volumes-backups
mkdir -p "${BACKUP_DIR}"

# 获取所有运行中的容器ID
container_ids=$(docker ps -q)

# 对每个容器ID进行循环
for id in ${container_ids}; do
    # 获取挂载的卷
    volume_paths=$(docker inspect $id --format '{{ range .Mounts }}{{ .Name }}:{{ .Source }} {{ end }}')
    
    # 如果容器没有挂载卷,则跳过
    if [ -z "${volume_paths}" ]; then
        continue
    fi
    
    # 对每个挂载的卷进行循环
    for volume_path in ${volume_paths}; do
        IFS=':' read -r volume_name volume_source <<< "${volume_path}"
        echo "正在备份 ${volume_name}..."
        
        # 创建备份
        docker run --rm -v "${volume_source}:/volume" -v "${BACKUP_DIR}":/backup ubuntu tar czvf "/backup/${volume_name}-backup.tar.gz" /volume
    done
done

echo "备份完成,文件保存在 ${BACKUP_DIR}"

自动恢复脚本(auto_restore.sh)

这个脚本会扫描当前目录下的所有备份文件,并尝试根据这些文件恢复Docker卷。

#!/bin/bash

# 定义备份文件的位置
# 使用 pwd 命令获取当前工作目录的绝对路径,并构建备份目录的绝对路径
BACKUP_DIR="$(pwd)/docker-volumes-backups"


# 检查备份目录是否存在
if [ ! -d "${BACKUP_DIR}" ]; then
  echo "备份目录 ${BACKUP_DIR} 不存在。"
  exit 1
fi

# 获取所有备份文件
backup_files=$(ls ${BACKUP_DIR}/*.tar.gz)

# 对每个备份文件进行循环
for file in ${backup_files}; do
    # 从文件名中提取卷名
    volume_name=$(basename "${file}" "-backup.tar.gz")
    
    echo "正在恢复 ${volume_name}..."
    
    # 检查是否存在同名卷,如果不存在,则创建
    if ! docker volume ls --format '{{ .Name }}' | grep -qw "${volume_name}"; then
        docker volume create "${volume_name}"
    fi
    
    # 恢复卷
    docker run --rm -v "${volume_name}:/volume" -v "${BACKUP_DIR}":/backup ubuntu tar xzvf "/backup/${volume_name}-backup.tar.gz" -C /volume
done

echo "恢复完成。"

使用说明

  1. 备份:在原服务器上运行./auto_backup.sh来自动备份所有运行中容器的卷。
  2. 恢复:在新服务器上,将备份文件传输到相同的备份目录,然后运行./auto_restore.sh来恢复卷。

这些脚本自动化了备份和恢复过程,大大简化了管理Docker卷的复杂性。在使用之前,请确保在安全环境中测试这些脚本,以验证它们按预期工作。