当前位置: 首页 > news >正文

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

容器和镜像的区别

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

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

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

http://www.dtcms.com/a/105722.html

相关文章:

  • 【PostgreSQL】【第3章】PostgreSQL的对象操作
  • C# ini文件全自动界面配置:打开界面时读ini配置到界面各控件,界面上的控件根据ini文件内容自动生成,点保存时把界面各控件的值写到ini里。
  • 建筑物自动化监测解决方案
  • Docker Api开启TLS认证流程
  • HTTP代理:网页加速的隐形引擎
  • 表单的前端数据流向
  • MATLAB之数据分析图系列:从二维到三维(直接套用)
  • 测试团队UI自动化实施方案
  • 【轻松学C:编程小白的大冒险】— 12.2 瑞士军刀出鞘:switch-case 的多分支江湖
  • 有序数组的归并算法思路
  • 如何实现局域网内无痛访问Jupyter Notebook?
  • Linux中常用服务器监测命令(性能测试监控服务器实用指令)
  • oracle数据泵操作
  • 从零实现Json-Rpc框架】- 项目实现 - 服务端registrydiscovery实现
  • Spring boot 中QPS(Queries Per Second)与 TPS(Transactions Per Second)详细对比
  • struct 中在c++ 和c中用法区别
  • Hue:一个大数据查询工具
  • MSTP多域生成树
  • SpringBoot 7 种实现 HTTP 调用的方式
  • 阶段项目:Windows 服务器的组建与管理
  • java设计模式之桥接模式(重生之我在地府当孟婆)
  • 2025年SQL2API平台推荐:QuickAPI、dbapi 和 Magic API 介绍与对比
  • Kubernetes 入门篇之Master节点部署与安装
  • 基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)
  • VMware Workstation Pro下载链接
  • 【图像去噪】论文复现:灵感源自MAE!进一步解决BSN的局限性,破坏真实噪声的空间相关性!AMSNet的Pytorch源码复现,跑通源码,原理详解!
  • SQL Server:数据库镜像端点检查
  • 图解AUTOSAR_SWS_CANStateManager
  • STM32 FATFS - 在spi的SD卡中运行fatfs
  • 招标采购管理系统智能化亮点应用场景举例