登录
首页 >  文章 >  linux

Docker镜像导出导入教程:save与load详解

时间:2026-04-24 11:33:59 381浏览 收藏

本文深入解析了 Docker 镜像迁移的核心操作——`docker save` 与 `docker load` 的正确用法,明确区分其与 `export`/`import` 的本质差异:前者完整保留镜像的分层结构、构建历史、元数据和标签信息,支持版本回滚与构建复用;后者仅导出容器当前文件系统快照,彻底丢失 layer 历史和配置指令,不可逆且不适用于镜像备份。文章手把手指导如何安全导出单个/多个镜像、压缩传输、离线导入及跨版本兼容避坑,并强调关键原则——“导出镜像必须用 save,不是 export”,同时点明 `commit + save` 在需保存运行时修改场景下的不可替代性,帮助开发者从根本上避免因概念混淆导致的部署失败、调试困难与维护断层。

Docker怎么导出和导入镜像 Docker Save和Load命令用法详解

docker savedocker load,别用 export/import —— 后者导出的是容器快照,丢 layer 历史、不保留镜像元数据,没法回滚或复用构建逻辑。

导出镜像必须用 docker save,不是 export

很多人混淆 exportsave:前者操作对象是「运行中或已停止的容器」,后者才是「镜像」。导出镜像时若误用 docker export -o app.tar mycontainer,得到的只是一个扁平化 tar 包,所有 layer 信息、构建指令(CMDENVEXPOSE)全丢失,docker import 后也无法用原标签启动容器。

正确做法是确认目标是镜像 ID 或带标签的镜像名:

  • docker images 查看本地镜像列表,记下 REPOSITORY:TAGIMAGE ID
  • 导出单个镜像:docker save -o nginx.tar nginx:1.25
  • 导出多个镜像到同一文件:docker save -o apps.tar nginx:1.25 redis:7.2 alpine:3.20
  • 想压缩节省空间?直接管道接 gzipdocker save nginx:1.25 redis:7.2 | gzip > apps.tar.gz

注意:save 不会自动压缩,-o 必须指定文件路径;不加 -o 会输出到 stdout,容易卡住或丢失。

docker load 只认 save 生成的 tar,且不支持重命名

docker loadsave 的严格逆操作,只接受由 save 产生的归档(含 manifest 和 layer 结构),不能加载 export 出来的容器快照。

导入时常见错误:

  • 执行 docker load -i wrong_format.tar 报错 Error processing tar file(exit status 1): unexpected EOF → 文件根本不是 save 产出的
  • loaddocker images 看不到镜像 → 检查是否漏了 -i 参数,或文件权限不足(尤其跨平台传输后)
  • 想导入时改标签?不行。load 会完全还原原始 REPOSITORY:TAG,改名得靠 docker tag 后续操作

导入方式有三种,任选其一即可:

  • docker load -i nginx.tar
  • docker load
  • 导入压缩包:gunzip -c apps.tar.gz | docker load(注意不是 docker load -i apps.tar.gzload 不解压)

离线迁移时,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 文件体积大(尤其多层镜像),传输中断会导致文件损坏;建议校验 sha256sumload

验证是否成功:导入后立刻执行 docker images | grep 对应镜像名,再 docker inspect 镜像IDRepoTagsLayers 字段是否完整。

什么时候该用 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 为空的问题,会花掉远超预期的时间。

以上就是《Docker镜像导出导入教程:save与load详解》的详细内容,更多关于Linux的资料请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>