Docker的备份与恢复

一、两种基本方式

docker export / import

  1. 在服务器上导出容器

    powershell 复制代码
    docker export container_name > container_backup.tar
    • 这里使用 > 重定向时默认保存路径为当前运行命令的路径,可以自行指定绝对路径来保存,后续加载时也使用对应的路径即可。
  2. 恢复为容器,这个命令会把.tar文件导入为一个新的镜像

    powershell 复制代码
    docker import container_backup.tar my_restored_image
  3. 基于新镜像启动容器(以下是基础启动命令,可根据需求进行更改)

    powershell 复制代码
    docker run --it --name new_container_name my_restored_image

docker commit + save/load

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

  1. 保存

    powershell 复制代码
    docker commit container_name my_image
    docker save my_image > my_image.tar
  2. 恢复

    powershell 复制代码
    docker load < my_image.tar
    docker run ...

对比:

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

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

  1. 我首先启动了一个基于基础镜像的容器:

    powershell 复制代码
    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. 将当前容器保存为镜像

    powershell 复制代码
    docker commit xal_MMSA mllm:xal_backup
    • 这会创建一个新的镜像 mllm:xal_backup,包含容器当前所有文件系统的更改。(为什么使用mllm:xal_backup呢,后面会解释到,docker的命名有一套规则,想要了解可以看下去)
  3. 保存镜像为.tar文件

    powershell 复制代码
    docker save mllm:xal_backup > xal_backup.tar
    • 你可以把这个.tar文件复制、上传到其他地方恢复,同样的这里展示使用的都是相对路径
  4. 恢复

    powershell 复制代码
    docker load < xal_backup.tar
  5. 编写恢复运行的命令

    powershell 复制代码
    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 路径、容器名、说明(可选)
bash 复制代码
#!/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 文件带了日期并使用了绝对路径,便于归档和灵活恢复

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

powershell 复制代码
chmod +x backup_container.sh

./backup_container.sh "ssh,tmux"

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

powershell 复制代码
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_日期

bash 复制代码
#!/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

使用示例

powershell 复制代码
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的解释。

容器和镜像的区别


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




相关推荐
Java陈序员2 天前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
爱吃橘子橙子柚子3 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Sheffield4 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽4 天前
win10下运行Start Broker and Proxy报错解决
docker
舒一笑5 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData5 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
用户13573999256605 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h5 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔5 天前
通过 Docker 创建开发环境
docker·开发环境