1. 概述

Docker生态系统包含了许多工具和特性,有时可能会让人感到困惑。在这篇简短的文章中,我们将探讨Docker的'save'命令与'export'命令之间的区别。

2. Docker镜像 vs 容器

为了理解这两个命令之间的差异,我们首先需要了解Docker镜像与容器的区别。

Docker镜像是一个包含运行应用程序所需的所有文件的文件。这包括操作系统文件、应用代码以及任何必需的支持库。

Docker容器是启动的Docker镜像。容器本质上是一个正在运行的应用程序。容器消耗内存和CPU资源,就像普通进程一样,并且可以通过网络协议访问文件系统并与其它容器进行通信。

Docker容器和镜像类似于Java类和对象。Java类是创建对象的蓝图,就像Docker镜像是创建容器的蓝图。就像一个类可以实例化为多个对象一样,一个Docker镜像可以用来启动多个容器。

基于此,我们可以更深入地探讨Docker 'save'命令与'export'命令之间的区别。

3. 'docker save'

Docker 'save'命令将Docker镜像保存到tar文件中。这个命令对于在不同的注册表之间移动Docker镜像或仅使用Linux的tar命令检查镜像内容非常有用。

默认情况下,命令将tar文件内容输出到STDOUT,因此通常的用法是:

docker save IMAGE > /path/to/file.tar

请注意,我们也可以指定输出文件以打印内容,因此不需要重定向:

docker save -o /path/to/file.tar IMAGE 

在两种情况下,'IMAGE'参数可以是以下两个值之一:

  • 完全限定的镜像名称,例如,“ghcr.io/baeldung/my-application:1.2.3”
  • Docker生成的镜像哈希,例如,“c85146bafb83”

4. 'docker export'

Docker 'export'命令将Docker容器保存到tar文件中。这包括启动容器时的镜像文件以及容器运行期间所做的任何更改。

语法与'save'命令完全相同。与'save'命令一样,'export'命令将输出发送到STDOUT,因此我们需要将其重定向到文件:

docker export CONTAINER > /path/to/file.tar

或者我们可以指定输出文件名:

docker export -o /path/to/file.tar CONTAINER

在两种情况下,'CONTAINER'参数可以是以下值之一:

  • 容器名称,无论是自动生成的还是启动容器时指定的
  • Docker引擎分配的唯一容器哈希

5. save与export之间的区别

尽管这两种命令在本质上相似,但需要注意一些区别。两者都产生tar文件,但包含的信息不同。

'save'命令保留了镜像层信息,包括所有历史记录和元数据。这允许我们完整导入tar文件到任何Docker注册表并用于启动新容器。

相反,**'export'命令不保留这些信息**。它包含了启动容器时的相同文件,但没有历史记录和元数据。

此外,'export'命令包括容器运行期间所做的更改,如新文件或修改的文件。这意味着 从同一镜像导出的不同容器可能产生不同的tar文件

6. Docker中Import与Load的区别

如上所述,'save'/'export'命令允许创建共享的tar图像。为了利用这些图像,Docker提供了通过'import'/'load'命令的两种选项。

第一个选项是'import'命令。它与导出容器的文件系统一起工作,并将其作为Docker镜像导入。此命令可以从文件或包含容器文件系统的快照的URL创建新的镜像。

第二个选项是'load'命令。它允许从使用Docker 'save'命令导出的tar存档运行图像。它恢复图像及其标签。

总结一下,**'import'命令用于与Docker 'export'创建的tar文件一起使用,它将容器卸载到文件并通过删除容器的历史来扁平化图像。另一方面,'load'命令用于与Docker 'save'创建的tar文件一起使用。它获取图像或存储库的完整内容并保留历史记录**。

7. 结论

在这篇教程中,我们看到了Docker 'save'与'export'命令之间的区别。虽然它们具有类似的语法并创建tar文件,但它们服务于不同的目的。'save'命令用于镜像,而'export'命令用于容器。