我最近几天一直在研究Docker,并且已经创建了一些镜像(这真的很有趣!)现在我想要保存我的工作内容,并尝试使用save
和export
命令,但我并不完全理解它们的差异。
save
和export
在Docker中有何区别?
简而言之:
save
命令将获取一个镜像:对于虚拟机或物理服务器,它将是安装的 .ISO 镜像或磁盘。基本操作系统。
它将打包构建镜像所需的所有链的层和元数据。你可以将这个“保存”的镜像链加载到另一个Docker实例中,并从这些镜像创建容器。
export
命令将获取整个容器:就像常规VM的快照。当然保存了操作系统,还保存了在容器生命周期内进行的任何更改,写入的任何数据文件。它更像传统备份。
它会给你一个包含你的容器文件系统的平坦 .tar 归档文件。
编辑:由于我的解释可能仍然会导致混淆,我认为重要的是要理解其中一个命令与容器一起使用,而另一个命令与镜像一起使用。
镜像应被视为“死”或不可变的,从中启动0或1000个容器不会更改单个字节。这就是为什么我先前将其与系统安装ISO进行比较的原因。它甚至可能更接近于现场 CD。
容器“引导”镜像并在其顶部添加一个附加层。该层存储容器上的任何更改(创建/更改/删除文件...)。
docker commit
命令)。然后,我可以将该镜像进行 save
(保存)。或者,我可以直接 export
(导出)容器。这两种方式(save
镜像和 export
容器)都会产生相同的结果? - Thomas Uhrigexport
将为您提供一个扁平的.tar归档文件,其中包含您的容器文件系统。save
将打包所有构建镜像所需的链的层和元数据。然后,您可以将此“已保存”的图像链加载到另一个Docker实例中,并从这些图像创建容器。 - mbarthelemysave
命令和 export
命令有两个主要区别。
save
命令保存整个图像及其历史记录和元数据,而 export
命令仅导出文件结构(不包括历史记录和元数据)。因此,导出的 tar 文件将比保存的文件小。
当您使用导出的文件系统创建新图像时,新图像将不包含 Dockerfile 中的任何 USER
、EXPOSE
、RUN
等命令。只有文件结构会被传输。
因此,当您在 Dockerfile 中使用以上关键字时,无法使用 export
命令将镜像传输到另一台机器,必须始终使用 save
命令。
导出
: 容器(文件系统)
->镜像tar包
。
导入
: 导出的镜像tar包
->镜像
。仅有一层。
保存
: 镜像
->镜像tar包
。
加载
: 保存的镜像tar包
->镜像
。所有层都将被恢复。
摘自《Docker实战 第二版》p190。
分层镜像维护了镜像历史记录、创建容器的元数据以及可能已被删除或覆盖的旧文件。
扁平化镜像仅包含文件系统中当前的一组文件。
从技术上讲,保存/加载是与仓库一起使用的,仓库可以是一个或多个镜像,也称为层。 镜像是存储库中的单个层。 最后,容器是已实例化的镜像(正在运行或未运行)。
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
save
保留的内容,而export
没有保留,其他答案都将其称为一些抽象的“元数据”。 - Antony Hatchkins