Docker的备份与恢复

发布于:2025-04-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、两种基本方式

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_image
    docker save my_image > my_image.tar
    
  2. 恢复
    docker load < my_image.tar
    docker 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/bash

CONTAINER_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=$1

docker 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,tmux
Image is saved as: mllm:xal_dev
The export file is saved in the path: /root/xal/docker_env/docker_backups/mllm_xal_dev_20250401.tar
The backup log is saved as: /root/xal/docker_env/docker_backups/backup.log

一键恢复脚本 restore_container.sh

该脚本将:

  • 加载指定 .tar 镜像

  • 使用固定镜像名 mllm:xal_dev

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

#!/bin/bash
if [ -z "$1" ]; then
  echo "$0 /path/to/backup.tar"
  exit 1
fi

TAR_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的解释。

容器和镜像的区别

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到