docker save用于导出镜像,保留完整分层结构、元数据和标签,支持docker load恢复;docker export用于导出容器文件系统快照,无历史层和元数据,需docker import转为新镜像。

用 Docker 打包和导出容器,关键看你要保留什么:是完整的镜像结构(含历史层、元数据),还是只取当前容器的文件系统快照。两种思路对应两套命令,不能混用。
导出镜像(推荐多数场景)
适用于你本地已有镜像,想把它完整打包带走——比如 rabbitmq:3.8-management、nginx:alpine 等。导出后别人 load 就能直接用,所有标签、分层、启动参数都保留。
- 导出命令:docker save -o 输出文件.tar 镜像名:标签
例如:
docker save -o mq.tar rabbitmq:3.8-management - 导入命令:docker load -i 输出文件.tar
例如:
docker load -i mq.tar,执行后镜像自动出现在docker images列表里 - 注意:save 只认镜像名,不接受容器名或 ID;文件名可任意,但扩展名建议用 .tar
把运行中的容器保存为新镜像再导出
适合你在容器里改了配置、装了插件、调好了环境,想把“此刻状态”固化成一个可复用的镜像。
- 先提交为镜像:docker commit 容器名或ID 新镜像名:版本
例如:
docker commit my-rabbit my-rabbit-custom:1.0 - 再导出这个新镜像:docker save -o custom-mq.tar my-rabbit-custom:1.0
- 这样得到的 tar 包和直接 save 原始镜像一样,支持 load + run,且保留 commit 时的环境变量、CMD、EXPOSE 等信息
只导出容器文件系统(轻量备份/分析用)
如果你只需要容器当前的文件内容(比如 /app 目录下的代码、日志、配置文件),不要历史、不要元数据、也不关心怎么启动,就用 export。
- 导出命令:docker export -o 输出文件.tar 容器名或ID
例如:
docker export -o app-files.tar web-server - 导入需转成镜像:docker import 输出文件.tar 新镜像名:标签
例如:
docker import app-files.tar my-app:from-export - 注意:import 生成的镜像没有原容器的 ENTRYPOINT/CMD,运行时得手动指定命令,比如
docker run -it my-app:from-export /bin/sh
常见误区提醒
docker save ≠ docker export:前者操作对象是镜像,后者只能作用于容器;docker load ≠ docker import:load 只能加载 save 产出的 tar,import 只能加载 export 或其他扁平 tar。
- 想迁移整个可运行环境 → 用 commit + save
- 只是备份当前文件状态或做安全审计 → 用 export
- 本地有镜像,没改过容器 → 直接 save 最省事











