数据卷(Volume)是Docker中持久化数据的关键机制,即使容器被删除,卷中的数据也不会丢失。备份卷是保护应用数据的核心步骤。
docker volume ls
命令查看当前系统中所有的数据卷,记录需要备份的卷名称(如my_volume
)。my_volume
的卷:docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar czf /backup/my_volume_backup_$(date +%F).tar.gz /data
解释: --rm
:容器执行完毕后自动删除;-v my_volume:/data
:将主机上的my_volume
卷挂载到容器内的/data
目录;-v $(pwd):/backup
:将主机当前目录挂载到容器内的/backup
目录(用于存储备份文件);busybox tar czf
:在容器内使用tar
命令将/data
目录压缩为my_volume_backup_日期.tar.gz
文件。#!/bin/bash BACKUP_DIR="/backup/docker_volumes" mkdir -p $BACKUP_DIR for volume in $(docker volume ls -q); do docker run --rm -v $volume:/data -v $BACKUP_DIR:/backup busybox tar czf "/backup/${volume}_backup_$(date +%F).tar.gz" /data done echo "All volumes backed up to $BACKUP_DIR"
该脚本会遍历所有卷,生成以卷名和日期命名的压缩文件,存储在/backup/docker_volumes
目录下。镜像是容器的模板,备份镜像可确保应用能在其他主机上快速恢复。
docker images
命令查看所有本地镜像,记录需要备份的镜像名称和标签(如my_app:latest
)。docker save
命令将镜像保存为压缩文件:docker save -o my_app_backup_$(date +%F).tar my_app:latest
解释: -o
:指定输出文件路径;my_app:latest
:要备份的镜像名称和标签。docker images -q | xargs -I {} docker save -o {}.tar {}
该命令会将所有镜像保存为<镜像ID>.tar
文件,存储在当前目录下。容器是镜像的运行实例,备份容器可保存其当前文件系统状态(如配置文件、临时数据)。
docker ps -a
命令查看所有容器(包括运行中和已停止的),记录需要备份的容器ID或名称(如my_container
)。docker export
命令将容器文件系统导出为tar文件:docker export -o my_container_backup_$(date +%F).tar my_container
解释: -o
:指定输出文件路径;my_container
:要备份的容器名称或ID。docker export
仅备份容器的文件系统,不包含镜像的元数据(如环境变量、端口映射),若需完整备份,建议优先备份镜像。Docker的配置文件存储了服务的全局设置(如日志驱动、存储驱动、网络配置),备份配置文件可确保服务恢复后保持一致。
/etc/docker/daemon.json
(若存在),使用cp
命令复制到备份目录:cp /etc/docker/daemon.json /backup/docker_daemon.json
/etc/docker/network
目录下,包含网络定义(如bridge、overlay网络),使用tar
命令打包备份:tar czvf /backup/docker_network_config_$(date +%F).tar.gz /etc/docker/network
/var/lib/docker
目录下,可使用tar
命令备份整个目录(需停止Docker服务以确保数据一致性):sudo systemctl stop docker tar czvf /backup/docker_data_$(date +%F).tar.gz /var/lib/docker sudo systemctl start docker
解释: stop docker
:停止Docker服务,避免备份过程中数据变化;start docker
:备份完成后启动服务。为避免手动操作遗漏,可通过脚本+定时任务实现自动化备份。
/usr/local/bin/backup_docker.sh
):#!/bin/bash BACKUP_DIR="/backup/docker" mkdir -p $BACKUP_DIR # 备份数据卷 for volume in $(docker volume ls -q); do docker run --rm -v $volume:/data -v $BACKUP_DIR:/backup busybox tar czf "/backup/${volume}_backup_$(date +%F).tar.gz" /data done # 备份镜像 docker images -q | xargs -I {} docker save -o "$BACKUP_DIR/{}_$(date +%F).tar" {} # 备份配置文件 cp /etc/docker/daemon.json "$BACKUP_DIR/docker_daemon.json" tar czvf "$BACKUP_DIR/docker_network_config_$(date +%F).tar.gz" /etc/docker/network echo "Docker backup completed at $(date)"
chmod +x /usr/local/bin/backup_docker.sh
crontab -e
命令编辑定时任务,例如每天凌晨2点执行备份:0 2 * * * /usr/local/bin/backup_docker.sh >> /var/log/docker_backup.log 2>&1
解释: 0 2 * * *
:每天凌晨2点执行;>> /var/log/docker_backup.log
:将输出追加到日志文件;2>&1
:将错误输出重定向到标准输出。rsync
等工具增量备份,减少备份时间和存储占用。