docker save/load用于镜像备份迁移,保留完整层结构和元数据,支持版本回滚;export/import针对容器快照,丢弃历史层与构建信息,仅保存当前文件系统状态。

用 docker save 和 docker load,别用 export/import —— 后者导出的是容器快照,丢 layer 历史、不保留镜像元数据,没法回滚或复用构建逻辑。
导出镜像必须用 docker save,不是 export
很多人混淆 export 和 save:前者操作对象是「运行中或已停止的容器」,后者才是「镜像」。导出镜像时若误用 docker export -o app.tar mycontainer,得到的只是一个扁平化 tar 包,所有 layer 信息、构建指令(CMD、ENV、EXPOSE)全丢失,docker import 后也无法用原标签启动容器。
正确做法是确认目标是镜像 ID 或带标签的镜像名:
-
docker images查看本地镜像列表,记下REPOSITORY:TAG或IMAGE ID - 导出单个镜像:
docker save -o nginx.tar nginx:1.25 - 导出多个镜像到同一文件:
docker save -o apps.tar nginx:1.25 redis:7.2 alpine:3.20 - 想压缩节省空间?直接管道接
gzip:docker save nginx:1.25 redis:7.2 | gzip > apps.tar.gz
注意:save 不会自动压缩,-o 必须指定文件路径;不加 -o 会输出到 stdout,容易卡住或丢失。
docker load 只认 save 生成的 tar,且不支持重命名
docker load 是 save 的严格逆操作,只接受由 save 产生的归档(含 manifest 和 layer 结构),不能加载 export 出来的容器快照。
导入时常见错误:
- 执行
docker load -i wrong_format.tar报错Error processing tar file(exit status 1): unexpected EOF→ 文件根本不是save产出的 - 用
load后docker images看不到镜像 → 检查是否漏了-i参数,或文件权限不足(尤其跨平台传输后) - 想导入时改标签?不行。
load会完全还原原始REPOSITORY:TAG,改名得靠docker tag后续操作
导入方式有三种,任选其一即可:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
docker load -i nginx.tardocker load- 导入压缩包:
gunzip -c apps.tar.gz | docker load(注意不是docker load -i apps.tar.gz,load不解压)
离线迁移时,save/load 的兼容性坑点
不同 Docker 版本间 save/load 大体兼容,但有两处容易栽跟头:
- 源环境 Docker 24+ 导出的镜像,若目标是 Docker 20.10 以下版本,
load可能失败(报invalid image format)→ 优先在目标环境版本上执行save - 镜像含 Windows 容器层(如
mcr.microsoft.com/dotnet/runtime:6.0-nanoserver),Linux 主机load后无法运行,但命令本身不报错 → 务必核对 OS 平台匹配性 -
save文件体积大(尤其多层镜像),传输中断会导致文件损坏;建议校验sha256sum再load
验证是否成功:导入后立刻执行 docker images | grep 对应镜像名,再 docker inspect 镜像ID 看 RepoTags 和 Layers 字段是否完整。
什么时候该用 commit + save 而不是直接 save
如果你要导出的不是原始镜像,而是「某个容器运行后修改过的状态」(比如装了调试工具、写了配置文件),那不能直接 save 原镜像 —— 它没变。
此时流程是:
- 先
docker commit -m "add curl and config" container_name myapp:debug - 再
docker save -o myapp-debug.tar myapp:debug
注意:commit 生成的新镜像会新增一层,但历史 layer 仍保留;save 这层也会被打包进去。而 export + import 会把所有 layer 合并成一层,彻底丢失可追溯性。
真正关键的不是记命令,而是分清「镜像」和「容器」——save/load 操作镜像,export/import 操作容器快照。一旦搞混,后续排查 layer 缺失、标签错乱、docker history 为空的问题,会花掉远超预期的时间。










