> 技术文档 > Docker的备份与恢复_docker 备份

Docker的备份与恢复_docker 备份


一、两种基本方式

docker export / import

  1. 在服务器上导出容器
    docker export container_name > container_backup.tar
    • 这里使用 > 重定向时默认保存路径为当前运行命令的路径,可以自行指定绝对路径来保存,后续加载时也使用对应的路径即可。
  2. 恢复为容器,这个命令会把.tar文件导入为一个新的镜像
    docker import container_backup.tar my_restored_image
  3. 基于新镜像启动容器(以下是基础启动命令,可根据需求进行更改)
    docker run --it --name new_container_name my_restored_image

docker commit + save/load

需要保留镜像的所有信息(包括 Dockerfile 构建历史、端口、CMD 等)的话,推荐使用这个方法!

  1. 保存
    docker commit container_name my_imagedocker save my_image > my_image.tar
  2. 恢复
    docker load < my_image.tardocker run ...

对比:

方法 文件系统 镜像元数据 用途 docker export / import电脑 √ × 仅导出容器文件内容 docker commit + save/load √ √ 保留镜像所有配置与历史

二、docker commit + save/load 的完整流程示例

  1. 我首先启动了一个基于基础镜像的容器:
    docker run --net host --name xal_MMSA --gpus all --shm-size 1t -it -v /root/xal/:/xal/ mllm:mac /bin/bash
    • 我在基础镜像 mllm:mac 的上修改了环境变量并安装了一下包,因此我不仅需要保存文件系统,我还需要保存当前的状态(包括手动修改的文件和已安装的软件)
    • 还要保留原有容器的配置(如网络、挂载、GPU、共享内存等),方便后续可以一键还原并运行
  2. 将当前容器保存为镜像
    docker commit xal_MMSA mllm:xal_backup
    • 这会创建一个新的镜像 mllm:xal_backup,包含容器当前所有文件系统的更改。(为什么使用mllm:xal_backup呢,后面会解释到,docker的命名有一套规则,想要了解可以看下去)
  3. 保存镜像为.tar文件
    docker save mllm:xal_backup > xal_backup.tar
    • 你可以把这个.tar文件复制、上传到其他地方恢复,同样的这里展示使用的都是相对路径
  4. 恢复
    docker load < xal_backup.tar
  5. 编写恢复运行的命令
    docker run --net host \\ --name xal_MMSA_restored \\ --gpus all \\ --shm-size 1t \\ -v /root/xal/:/xal/ \\ -it mllm:xal_backup /bin/bash
    • 注意:恢复后的容器名称不要和原来的一样,除非你先 docker rm xal_MMSA

三、使用脚本自动备份&恢复

自动 commit & save 并生成log文件(backup_container.sh)

这个脚本会:

  • 提交当前容器为镜像
  • 保存为 .tar 文件
  • 输出成功信息和版本号
  • 生成log文件,每条log包含时间、镜像名、tar 路径、容器名、说明(可选)
#!/bin/bashCONTAINER_NAME=\"xal_MMSA\"IMAGE_NAME=\"mllm:xal_dev\"DATE_TAG=$(date +\"%Y%m%d\")BACKUP_DIR=\"/root/xal/docker_env/docker_backups\"TAR_NAME=\"${BACKUP_DIR}/mllm_xal_dev_${DATE_TAG}.tar\"LOG_FILE=\"${BACKUP_DIR}/backup.log\"DESCRIPTION=$1docker commit \"$CONTAINER_NAME\" \"$IMAGE_NAME\"docker save \"$IMAGE_NAME\" > \"$TAR_NAME\"echo \"$DATE_TAG | container=$CONTAINER_NAME | image=$IMAGE_NAME | tar=$TAR_NAME | note=${DESCRIPTION:-\"None\"}\" >> \"$LOG_FILE\"echo \"Image is saved as: $IMAGE_NAME\"echo \"The export file is saved in the path: $TAR_NAME\"echo \"The backup log is saved as: $LOG_FILE\"
  • 这里保持了镜像名不变,这样每次 commit 都会“更新”这个镜像标签(相当于覆盖 mllm:xal_dev)
  • 但是 .tar 文件带了日期并使用了绝对路径,便于归档和灵活恢复

用法:给脚本加执行权限并运行

chmod +x backup_container.sh./backup_container.sh \"ssh,tmux\"

运行上述命令就会自动备份容器并生成记录,命令会显示:

20250401 | container=xal_MMSA | image=mllm:xal_dev | tar=/root/xal/docker_env/docker_backups/mllm_xal_dev_20250401.tar | note=ssh,tmuxImage is saved as: mllm:xal_devThe export file is saved in the path: /root/xal/docker_env/docker_backups/mllm_xal_dev_20250401.tarThe backup log is saved as: /root/xal/docker_env/docker_backups/backup.log

一键恢复脚本 restore_container.sh

该脚本将:

  • 加载指定 .tar 镜像

  • 使用固定镜像名 mllm:xal_dev

  • 启动新的容器(避免冲突),命名规则为 xal_MMSA_restored_日期

#!/bin/bashif [ -z \"$1\" ]; then echo \"$0 /path/to/backup.tar\" exit 1fiTAR_PATH=\"$1\"IMAGE_NAME=\"mllm:xal_dev\"DATE_TAG=$(date +\"%Y%m%d_%H%M%S\")CONTAINER_NAME=\"xal_MMSA_restored_$DATE_TAG\"docker load < \"$TAR_PATH\"# 启动容器(使用固定镜像)docker run --net host \\ --name \"$CONTAINER_NAME\" \\ --gpus all \\ --shm-size 1t \\ -v /root/xal/:/xal/ \\ -it \"$IMAGE_NAME\" /bin/bash

使用示例

chmod +x restore_container.sh./restore_container.sh /root/xal/docker_env/docker_backups/mllm_xal_dev_20250401.tar

这会启动一个名为 xal_MissMAC_restored_20250401 的新容器,镜像名为 mllm:xal_dev

Docker 镜像命名规范(ChatGPT 4o给出)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小白的疑问

Docker 小白(我本人哈哈哈哈哈)可能会有疑问为什么使用的时候是容器(container),但是保存的时候就一定只能保存为镜像(image),以下为 ChatGPT 4o的解释。

容器和镜像的区别

在这里插入图片描述
在这里插入图片描述

保存容器和保存镜像的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述