在Docker中保存和导出之间有什么区别?


Answers:


169

简短的答案是:

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

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

  • export将获取整个容器:就像常规VM的快照一样。当然,可以保存操作系统,还可以保存您所做的任何更改,以及保存容器寿命期间写入的任何数据文件。这更像是传统的备份。

    它将为您提供一个包含容器文件系统的平面.tar归档文件。

编辑:由于我的解释仍然可能导致混乱,我认为了解这些命令之一适用于容器,而其他命令适用于图像非常重要。

  • 一个图像必须被认为是“死”或不可变的,开始从它0或1000容器不会改变一个字节。这就是为什么我将之前与系统安装ISO进行比较的原因。它甚至更接近于现场CD。

  • 容器 “靴”的图像,并增加了在其顶部上的附加层。此层将所有更改存储在容器上(创建/更改/删除的文件...)。


2
为了澄清一下:假设我有一个正在运行的容器,在其中进行了一些更改(例如,创建了一个新文件夹)。现在,我可以使用制作该容器的图像docker commit。我可以然后save图像。或者我可以export直接使用容器。并且两种方式(save图像和export容器)将具有相同的结果?
Thomas Uhrig 2014年

2
是的,没有。该export会给你一个平坦的.tar归档文件包含你的容器的文件系统。save将打包构建图像所需的所有链的层和元数据。然后,您可以将该saved图像链加载到另一个docker实例中,并从这些图像创建容器。
mbarthelemy 2014年

7
@ThomasUhrig您可以使用export将容器“展平”为一层/基础图像。您也可以使用它来备份容器(fe数据容器)。但这也可以在没有export功能的情况下完成。
吉里(Jiri)2014年

9
而且,export所有元数据都将丢失,因此,如果尝试使用该图像运行容器,则需要重新设置CMD和其他元数据。 save对我来说还算不错,但是出口很麻烦
Mirage

1
我想将图像更新为最新版本。现在正在运行的容器对内部文件系统进行了一些更改。升级后,我希望还原这些更改。据我了解,保存/加载和导出/导入都会为我创建一个新图像,这不是我想要的。我想从dockerhub使用新版本的映像,但是从现有容器还原数据。最好的行动方针是什么?
德米特里z

20

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

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

  2. 当您使用导出的文件系统创建一个新的图像,然后这个新的图像将不包含任何USEREXPOSERUN等命令,从您的Dockerfile。仅文件结构将被传输。因此,当您在Dockerfile中使用提及的关键字时,您将无法使用export命令将映像传输到另一台机器-您需要始终使用save命令。


4

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

保存的图像具有图层和历史信息,因此更大。

如果将其提供给客户,那么问题是您是否要保留这些层次?


因此,导出类似于txt文件,上面没有写任何内容吗?@neil
AATHITH RAJENDRAN '19

4
就像没有撤消缓冲区的文本文件8)
Neil McGill

2

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


1

Docker save生成tar文件存储库,其中包含image所提供的每个参数的所有父层,所有标记+版本或指定的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]容器

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

--help = false打印用法-o,--output =“”写入文件,而不是STDOUT


1
问题是关于两个命令之间的区别,而不是关于广义的定义和用法!
阿布·舒蒙

0

exportcontainer (filesystem)- > image tar
importexported image tar- > image。只有一层。

saveimage- > image tar
loadsaved image tar- > image。所有层将被恢复。

来自Docker in Action,第二版 p190。

分层图像保留图像的历史记录,容器创建元数据以及可能已被删除或覆盖的旧文件。

展平的图像仅包含文件系统上的当前文件集。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.