docker export/import 迁移的是容器文件系统快照,不保留历史层、元数据和启动指令,仅适用于离线部署、快速同步或临时备份,导入后需手动指定cmd等配置。
直接用 docker export 和 docker import 迁移运行中容器的文件系统快照,本质是“拍一个当前状态的照片”,不依赖镜像构建过程,也不需要网络或镜像仓库。它适合离线交付、快速环境同步或临时备份,但要注意它导出的只是扁平化文件系统,没有历史层、启动指令或元数据。
导出正在运行的容器为 tar 文件
容器是否运行不影响导出——export 拿的是可写层与只读层合并后的当前文件系统快照。只要容器存在(无论状态),就能导出。
- 先查容器名或 ID:
docker ps -a - 导出到当前目录的 tar 文件:
docker export my-container > app-snapshot.tar - 或用
-o指定路径更稳妥:docker export -o /backup/app-snapshot.tar my-container - 导出时建议暂停写入敏感服务(如数据库),避免文件系统不一致;但对大多数无状态应用,直接导出即可
导入 tar 文件生成新镜像
import 把 tar 包变成一个可运行的新镜像,但它是“空白画布”——没 CMD、没 EXPOSE、没环境变量。必须手动补上启动命令,否则 docker run 会报 No command specified。
- 基础导入:
docker import app-snapshot.tar myapp:v1 - 带启动指令导入(推荐):
cat app-snapshot.tar | docker import -c 'CMD ["nginx", "-g", "daemon off;"]' - myapp:v1 - 也可导入后通过
docker run显式指定命令:docker run -d --name web myapp:v1 nginx -g "daemon off;"
迁移后验证与注意事项
导入的镜像不是原镜像的复制,而是全新构造的单层镜像。它能跑起来,但别指望它和原始镜像行为完全一致。
- 检查内容是否完整:
docker run --rm myapp:v1 ls /app/config.json - 确认端口、挂载卷等需在
run时重新指定,export/import不保存这些运行时配置 - 无法用
docker history查看构建步骤,也无法用docker inspect看到原始ENV或WORKDIR - 若原容器依赖特定用户权限或初始化脚本,导入后可能需额外
chown或ENTRYPOINT补齐
什么情况下该用 export/import,而不是 save/load
当目标环境没有 Registry、不能联网、或你只想传“此刻能跑的状态”,而不是“怎么构建出来的全过程”,就选 export/import。
- 内网隔离环境部署(如客户私有云、离线机房)
- 开发人员把配好依赖的测试容器打包给 QA 直接运行
- 紧急故障现场备份:容器还在跑,立刻导出保留现场文件系统
- 注意:CI/CD 流水线、需要复现构建过程、或要多平台兼容时,应优先用
save/load或 Registry 推送











