Docker save 和 export 的区别

使用 docker 也有一段时间了,每次使用 docker help 的时候,我都很好奇 saveexport 的区别,由于本人一般比较倾向于用 Dockerfilevolume 来迁移和保存数据,所以对此两个功能没多做研究。今天闲来无事,便研究一下这两个命令的区别,做些知识储备。

1
2
3
4
5
6
7
8
9
Hzzs-MacBook-Pro:~ hzz$ docker help

export Export a container's filesystem as a tar archive
将容器的文件系统导出为 tar 存档

save Save one or more images to a tar archive (streamed to STDOUT by default)
将一个或多个镜像保存到 tar 归档文件(默认输出到标准输出,即需手动重定向到 tar 文件)

Hzzs-MacBook-Pro:~ hzz$

单从字面上了解,可以知道 export 导出的是容器,save 保存的是镜像。

导出容器,顾名思义,就是将整个容器打包,打包的内容包括镜像,以及容器运行时所变更的文件和配置。import 以后,容器还原度较高,数据得以保存。

而保存镜像,则是将容器运行的镜像保存,容器运行时所做出的文件和配置变更将会丢失。load 之后运行,只能得到一个纯净的容器,之前容器运行的数据丢失。

那既然这样,直接导出容器不就好了,为什么还需要保存镜像这样一个功能呢。原因是,导出容器,只能导出容器相关镜像当前的 layer,无法获取镜像历史信息,也无法将镜像进行回滚;而保存镜像,则可以将镜像历史 layer 保存,从而可以得到镜像的完整信息,以及必要时回滚到以前的 layer。

总之,这两个功能是针对不同的对象而设立的,以便满足不同的导出需求。

需要额外注意的是,saveexport 默认都是输出到标准输出的,执行时需手动重定向到 tar 文件。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# export and import
docker export <CONTAINER> > export.tar

docker export <CONTAINER> -o export.tar

docker import - [REPOSITORY[:TAG]] < export.tar

docker import export.tar [REPOSITORY[:TAG]]

# save and load
docker save <IMAGE> > save.tar

docker save <IMAGE> -o save.tar

docker load < save.tar

docker load --input save.tar