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

Tho*_*rig 149 docker

我和Docker一起玩了几天,我已经制作了一些图像(非常有趣!).现在我想坚持我的工作,来到saveexport命令,但我不完全理解他们.

saveexportDocker有什么区别?

mba*_*emy 158

简短的回答是:

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

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

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

    它将为您提供包含容器文件系统的扁平.tar存档.

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

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

  • 容器 "靴"的图像,并增加了在其顶部上的附加层.该层存储容器上的任何更改(创建/更改/删除的文件...).

  • @ThomasUhrig您可以使用导出将容器"展平"为一个图层/基本图像.您也可以使用它来备份容器(fe数据容器).但这也可以在没有`export`功能的情况下完成. (7认同)
  • 此外,使用`export`,所有元数据都将丢失,因此,如果您尝试使用该图像运行容器,则需要重新输入CMD和其他元数据.`save`对我来说很好,但出口很痛苦 (7认同)
  • 只是为了澄清一下:假设我有一个正在运行的容器,我在其中做了一些更改(例如,我创建了一个新文件夹)。现在我可以制作这个容器的图像(使用`docker commit`)。然后我可以“保存”图像。或者我可以直接“导出”容器。两种方式(`保存`图像和`导出`容器)都会有相同的结果? (2认同)
  • 是的,不是.`export`将为您提供包含容器文件系统的扁平.tar存档.`save`将打包构建图像所需的所有链的图层和元数据.然后,您可以将此"已保存"图像链加载到另一个docker实例中,并从这些图像创建容器. (2认同)

eNc*_*Nca 14

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

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

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


you*_*end 11

export: container (filesystem)-> image tar
import: exported image tar-> image。只有一层。

save: image-> image tar
load: saved image tar-> image。所有图层都将被恢复。

来自《Docker 实践》,第二版,第 190 页。

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

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


Nei*_*ill 5

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

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

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

  • 它就像一个没有撤消缓冲区的文本文件 8) (5认同)