Docker中“保存”和“导出”的区别是什么?

197

我最近几天一直在研究Docker,并且已经创建了一些镜像(这真的很有趣!)现在我想要保存我的工作内容,并尝试使用saveexport命令,但我并不完全理解它们的差异。

saveexport在Docker中有何区别?


6
我也在http://tuhrig.de/difference-between-save-and-export-in-docker上发布了一篇博客文章,介绍了Docker中“save”和“export”的区别。 - Thomas Uhrig
6个回答

199

简而言之:

  • save 命令将获取一个镜像:对于虚拟机或物理服务器,它将是安装的 .ISO 镜像或磁盘。基本操作系统。

    它将打包构建镜像所需的所有链的层和元数据。你可以将这个“保存”的镜像链加载到另一个Docker实例中,并从这些镜像创建容器。

  • export 命令将获取整个容器:就像常规VM的快照。当然保存了操作系统,还保存了在容器生命周期内进行的任何更改,写入的任何数据文件。它更像传统备份。

    它会给你一个包含你的容器文件系统的平坦 .tar 归档文件。

编辑:由于我的解释可能仍然会导致混淆,我认为重要的是要理解其中一个命令与容器一起使用,而另一个命令与镜像一起使用。

  • 镜像应被视为“死”或不可变的,从中启动0或1000个容器不会更改单个字节。这就是为什么我先前将其与系统安装ISO进行比较的原因。它甚至可能更接近于现场 CD。

  • 容器“引导”镜像并在其顶部添加一个附加层。该层存储容器上的任何更改(创建/更改/删除文件...)。


3
只是为了澄清一下:假设我有一个正在运行的容器,我对其进行了一些更改(例如,我新建了一个文件夹)。现在,我可以为该容器创建一个镜像(使用 docker commit 命令)。然后,我可以将该镜像进行 save(保存)。或者,我可以直接 export (导出)容器。这两种方式(save 镜像和 export 容器)都会产生相同的结果? - Thomas Uhrig
2
是的和不是。export将为您提供一个扁平的.tar归档文件,其中包含您的容器文件系统。save将打包所有构建镜像所需的链的层和元数据。然后,您可以将此“已保存”的图像链加载到另一个Docker实例中,并从这些图像创建容器。 - mbarthelemy
7
你可以使用导出功能将容器“压缩”为一个层次/基础镜像。此外,你也可以使用它备份容器(例如数据容器)。但是这也可以在不使用"export"功能的情况下完成。 - Jiri
15
此外,使用“export”将丢失所有元数据,因此如果您尝试使用该镜像运行容器,则必须重新提及CMD和其他元数据。“save”对我很有效,但“export”很麻烦。 - Mirage
1
我想将我的镜像更新到最新版本。当前正在运行的容器对内部文件系统进行了一些更改。升级后,我希望这些更改得以恢复。据我所知,保存/加载和导出/导入都会为我创建一个新的镜像,这不是我想要的。我想使用来自dockerhub的镜像的新版本,但从现有容器中恢复数据。最好的做法是什么? - Dmitry z
显示剩余2条评论

38

save 命令和 export 命令有两个主要区别。

  1. save 命令保存整个图像及其历史记录和元数据,而 export 命令仅导出文件结构(不包括历史记录和元数据)。因此,导出的 tar 文件将比保存的文件小。

  2. 当您使用导出的文件系统创建新图像时,新图像将不包含 Dockerfile 中的任何 USEREXPOSERUN 等命令。只有文件结构会被传输。 因此,当您在 Dockerfile 中使用以上关键字时,无法使用 export 命令将镜像传输到另一台机器,必须始终使用 save 命令。


11

导出: 容器(文件系统)->镜像tar包
导入: 导出的镜像tar包->镜像。仅有一层。

保存: 镜像->镜像tar包
加载: 保存的镜像tar包->镜像。所有层都将被恢复。

摘自《Docker实战 第二版》p190。

分层镜像维护了镜像历史记录、创建容器的元数据以及可能已被删除或覆盖的旧文件。

扁平化镜像仅包含文件系统中当前的一组文件。


6
导出的图片不会保存任何图层或历史记录信息,因此文件较小且无法进行回滚。
保存的图片将包含图层和历史记录信息,因此文件较大。
如果将其提供给客户,问题是您是否需要保留这些图层?

所以,导出文件就像一个没有任何内容的文本文件,对吧?@neil - AATHITH RAJENDRAN
6
这就像是一个没有撤销缓冲区的文本文件 8) - Goblinhack

4

从技术上讲,保存/加载是与仓库一起使用的,仓库可以是一个或多个镜像,也称为层。 镜像是存储库中的单个层。 最后,容器是已实例化的镜像(正在运行或未运行)。


2

Docker save 会生成一个 tar 文件,其中包含所有父层,以及每个参数提供的所有标签 + 版本或指定的 repo:tag。

Docker export 会生成一个指定文件(可以是 tar 或 tgz 格式),其中的内容是来自 Container 的扁平化内容,不包括指定卷的内容。

docker save 需要用于 docker 镜像,而 docker export 需要用于容器(就像运行镜像一样)。

使用方法

docker save [OPTIONS] IMAGE [IMAGE...]

将一个或多个镜像保存为 tar 存档文件(默认情况下流式传输到 STDOUT)

--help=false 打印使用方法 -o, --output="" 写入文件, 而不是 STDOUT

使用方法

docker export [OPTIONS] CONTAINER

将容器文件系统的内容导出为 tar 存档文件

--help=false 打印使用方法 -o, --output="" 写入文件, 而不是 STDOUT


1
问题是关于两个命令之间的区别,而不是关于广义定义和用法的! - Abu Shumon
@AbuShumon Sachin清楚地解释了save保留的内容,而export没有保留,其他答案都将其称为一些抽象的“元数据”。 - Antony Hatchkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接