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

What is the difference between save and export in Docker?

我和Docker玩了几天,我已经拍了一些照片(真的很有趣!).现在,我想坚持自己的工作,来听saveexport的命令,但我不完全理解。

Docker中的saveexport有什么区别?


简短的回答是:

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

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

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

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

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

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

  • 一个容器"引导"图像并在其上添加一个附加层。此层存储容器上的任何更改(创建/更改/删除的文件…)。


saveexport命令有两个主要区别。

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

  • 使用导出的文件系统创建新映像时,此新映像将不包含来自DockerFile的任何USEREXPOSERUN等命令。只传输文件结构。因此,当您在dockerfile中使用上述关键字时,您不能使用export命令将图像传输到另一台机器上-您需要始终使用save命令。


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

    保存的图像将有层和历史信息,所以更大。

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


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


    docker save为image提供的每个参数生成一个tar文件repo,其中包含所有父层、所有标记+版本或指定的repo:tag。

    docker export生成指定的文件(可以是tar或tgz),其中包含平面内容,而不包含容器中指定卷的内容。

    docker save需要在docker image上使用,docker export需要在容器上使用(就像运行image一样)

    节约使用

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

    Save an image(s) to a tar archive (streamed to STDOUT by default)

    --help=false Print usage -o, --output="" Write to a file,
    instead of STDOUT

    出口使用

    docker export [OPTIONS] CONTAINER

    Export the contents of a container's filesystem as a tar archive

    --help=false Print usage -o, --output="" Write to a file,
    instead of STDOUT