一、两种基本方式
docker export / import
-
在服务器上导出容器
powershelldocker export container_name > container_backup.tar
- 这里使用
>
重定向时默认保存路径为当前运行命令的路径,可以自行指定绝对路径来保存,后续加载时也使用对应的路径即可。
- 这里使用
-
恢复为容器,这个命令会把
.tar
文件导入为一个新的镜像powershelldocker import container_backup.tar my_restored_image
-
基于新镜像启动容器(以下是基础启动命令,可根据需求进行更改)
powershelldocker run --it --name new_container_name my_restored_image
docker commit + save/load
需要保留镜像的所有信息(包括 Dockerfile 构建历史、端口、CMD 等)的话,推荐使用这个方法!
-
保存
powershelldocker commit container_name my_image docker save my_image > my_image.tar
-
恢复
powershelldocker load < my_image.tar docker run ...
对比:
方法 | 文件系统 | 镜像元数据 | 用途 |
---|---|---|---|
docker export / import电脑 | √ | × | 仅导出容器文件内容 |
docker commit + save/load | √ | √ | 保留镜像所有配置与历史 |
二、docker commit + save/load 的完整流程示例
-
我首先启动了一个基于
基础镜像
的容器:powershelldocker run --net host --name xal_MMSA --gpus all --shm-size 1t -it -v /root/xal/:/xal/ mllm:mac /bin/bash
- 我在基础镜像
mllm:mac
的上修改了环境变量并安装了一下包,因此我不仅需要保存文件系统,我还需要保存当前的状态(包括手动修改的文件和已安装的软件) - 还要保留原有容器的配置(如网络、挂载、GPU、共享内存等),方便后续可以一键还原并运行
- 我在基础镜像
-
将当前容器保存为镜像
powershelldocker commit xal_MMSA mllm:xal_backup
- 这会创建一个新的镜像
mllm:xal_backup
,包含容器当前所有文件系统的更改。(为什么使用mllm:xal_backup
呢,后面会解释到,docker的命名有一套规则,想要了解可以看下去)
- 这会创建一个新的镜像
-
保存镜像为
.tar
文件powershelldocker save mllm:xal_backup > xal_backup.tar
- 你可以把这个
.tar
文件复制、上传到其他地方恢复,同样的这里展示使用的都是相对路径
- 你可以把这个
-
恢复
powershelldocker load < xal_backup.tar
-
编写恢复运行的命令
powershelldocker 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的解释。
容器和镜像的区别
保存容器和保存镜像的区别