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

我玩了几天的 多克和我已经做了一些图像(这真的很有趣!).现在我想坚持我的工作,来到 saveexport命令,但我不完全理解他们。

在 Docker 中 saveexport的区别是什么?

67453 次浏览

简短的回答是:

  • save将获取一个映像: 对于 VM 或物理服务器,这将是安装。ISO 图像或磁盘。基本操作系统。

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

  • export将获取整个容器: 就像普通 VM 的快照一样。当然可以保存操作系统,但也可以保存您所做的任何更改,以及在容器生命周期内编写的任何数据文件。这个更像是传统的备份。

    它将提供一个扁平的. tar 归档文件,其中包含容器的文件系统。

编辑: 由于我的解释仍然可能导致混淆,我认为理解这些命令中的一个用于容器,而另一个用于图像是很重要的。

  • 一个 形象必须被认为是“死的”或不可变的,从它开始0或1000个容器不会改变一个字节。这就是为什么我比较了早期的系统安装 ISO。也许更接近于现场 CD。

  • 集装箱“引导”图像并在其上添加一个额外的图层。此层存储容器上的任何更改(创建/更改/删除文件...)。

从技术上讲,保存/加载与存储库一起工作,存储库可以是一个或多个映像,也称为层。图像是回购中的一个单层。最后,容器是一个实例化的映像(运行或不运行)。

导出的图像不会保存任何图层或历史记录信息,因此它会更小,您将无法回滚。

保存的图像 威尔有图层和历史信息,因此较大。

如果把这个给客户,问题是你想不想保留这些图层?

saveexport命令之间有两个主要区别。

  1. save命令用历史和元数据保存整个图像,但是 export命令只导出文件结构(没有历史和元数据)。所以导出的 tar 文件比保存的要小。

  2. 当您使用导出的文件系统创建一个新的图像,然后这个新的图像将不包含任何 USEREXPOSERUN等命令从您的 Dockerfile。只有文件结构将被传输。 因此,当您在 Dockerfile 中使用上述关键字时,就不能使用 export 命令将图像传输到另一台计算机——您需要始终使用 save 命令。

Docker 拯救生成一个 tar 文件 repo,其中包含 形象提供的每个参数的所有父层、所有标记 + 版本或指定的 repo: tag。

Docker 出口生成指定的文件(可以是 tar 或 tgz) ,其中包含平面内容,而不包含来自 集装箱的指定卷的内容。

Docker 拯救需要在 docker 映像上使用,而 docker 出口需要在容器上使用(就像正在运行的映像)

保存用法

码头保存[选项]图像[图像... ]

将映像保存到 tar 归档文件(默认情况下流到 STDOUT)

—— help = false 打印用法——输出 = “”写入文件, 而不是 STDOUT

出口用途

码头出口[选择]集装箱

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

—— help = false 打印用法——输出 = “”写入文件, 而不是 STDOUT

container (filesystem)-> image tar.
exported image tar-> image只有一层。

image-> image tar.
saved image tar-> image。所有的层将被恢复。

来自 Docker in Action,第二版 p190。

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

扁平化的图像只包含文件系统上的当前文件集。