如何在不包含镜像的情况下备份/var/lib/docker目录?
如何备份Docker容器和卷并排除镜像文件
这个需求很合理——镜像确实没必要占用备份空间,毕竟大多能从公开源重新拉取,咱们重点保住容器配置、卷数据这些没法轻易恢复的内容就行。下面是两种常用的简便方法:
方法一:用rsync增量备份(推荐)
rsync适合做增量备份,而且能精准排除指定目录,命令如下:
sudo rsync -av --exclude='image' --exclude='distribution' --exclude='buildkit' /var/lib/docker/ /path/to/your/backup/location/docker/
各参数说明:
-a:归档模式,保留文件权限、时间戳、软链接等所有属性,保证备份的完整性-v:显示备份进度,方便你跟踪状态--exclude='image':核心排除项,这个目录存储了所有镜像的元数据,删掉它Docker就认不到本地镜像了--exclude='distribution':排除镜像分发缓存(比如拉镜像时的临时文件、索引缓存)--exclude='buildkit':如果用BuildKit构建过镜像,这个目录是构建缓存,也可以放心排除
方法二:用tar打包备份
如果需要把备份打包成压缩文件(方便传输或长期存储),可以用tar命令:
sudo tar -czf docker_backup.tar.gz --exclude='image' --exclude='distribution' --exclude='buildkit' /var/lib/docker/
各参数说明:
-c:创建新的归档文件-z:用gzip压缩,减少备份文件体积-f:指定备份文件的名称- 排除项和rsync的一致,都是镜像相关的冗余目录
重要注意事项
- 备份前建议停止Docker服务:虽然rsync和tar支持在线备份,但停止Docker能彻底避免数据不一致(比如容器正在写入日志或卷数据时)。停止命令:
sudo systemctl stop docker,备份完成后再启动:sudo systemctl start docker - 确认你的存储驱动:如果你的Docker用的不是默认的overlay2(比如devicemapper、aufs),
image目录依然是通用的镜像元数据目录,无需额外调整;如果不确定,可通过docker info | grep "Storage Driver"查看 - 验证备份完整性:备份完成后,记得检查目标目录/压缩包,确保
containers、volumes、networks这些关键目录都被保留,而image等排除项不在其中 - 恢复步骤:恢复时先停止Docker,将备份内容复制回
/var/lib/docker/,启动Docker后重新拉取所需镜像,容器就能基于恢复的配置和卷数据正常启动了
内容的提问来源于stack exchange,提问作者Maestro




