如何使用 docker image save 命令导出镜像

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用 docker save 命令将 Docker 镜像导出为 tar 归档文件。这是一项至关重要的技能,可用于备份镜像、在没有镜像仓库的系统之间传输镜像,或者将多个镜像打包以便分发。

你将探索保存单个镜像、将多个镜像保存到一个归档文件中、保存镜像的特定平台变体,以及使用 gzip 压缩保存的镜像归档文件。在本实验结束时,你将熟练掌握使用 docker save 进行各种镜像管理任务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") subgraph Lab Skills docker/pull -.-> lab-555162{{"如何使用 docker image save 命令导出镜像"}} docker/images -.-> lab-555162{{"如何使用 docker image save 命令导出镜像"}} docker/save -.-> lab-555162{{"如何使用 docker image save 命令导出镜像"}} end

将单个镜像保存到 tar 归档文件

在这一步中,你将学习如何将单个 Docker 镜像保存到 tar 归档文件中。这对于备份镜像或在没有直接 Docker 镜像仓库连接的情况下将镜像传输到另一个系统非常有用。

首先,让我们拉取一个简单的 Docker 镜像,用于本示例。我们将使用 hello-world 镜像,它体积小,适合用于演示。

docker pull hello-world

你应该会看到表明正在拉取和下载镜像的输出。

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

现在我们已经在本地有了 hello-world 镜像,我们可以使用 docker save 命令将其保存到 tar 归档文件中。基本语法是 docker save -o <output_file.tar> <image_name>

我们将把 hello-world 镜像保存到当前目录(~/project)中一个名为 hello-world.tar 的文件中。

docker save -o hello-world.tar hello-world

运行此命令后,~/project 目录中将创建一个名为 hello-world.tar 的文件。该文件包含 hello-world Docker 镜像。

你可以使用 ls -lh 命令验证文件是否已创建并检查其大小。

ls -lh hello-world.tar

你应该会看到类似以下的输出,显示文件大小:

-rw-r--r-- 1 labex labex ... hello-world.tar

现在可以将这个 tar 文件传输到另一台机器,并使用 docker load 命令加载它。

将多个镜像保存到一个 tar 归档文件

在上一步中,你学习了如何保存单个 Docker 镜像。在这一步中,你将学习如何将多个 Docker 镜像保存到一个单一的 tar 归档文件中。当你需要将多个镜像打包在一起进行分发或备份时,这非常方便。

首先,让我们拉取另一个 Docker 镜像,以便有多个镜像可供保存。我们将拉取 alpine 镜像,它是一个轻量级的 Linux 发行版。

docker pull alpine

你应该会看到表明正在拉取和下载 alpine 镜像的输出。

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

现在你本地同时拥有 hello-worldalpine 镜像。你可以通过列出本地镜像来验证这一点:

docker images

输出应该在列表中显示 hello-worldalpine

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    ...            ...            ...
alpine        latest    ...            ...            ...

要将多个镜像保存到一个单一的 tar 归档文件中,你只需在 docker save 命令的输出文件名后面列出镜像名称即可。语法是 docker save -o <output_file.tar> <image1_name> <image2_name> ...

我们将把 hello-worldalpine 镜像都保存到 ~/project 目录中一个名为 images.tar 的文件中。

docker save -o images.tar hello-world alpine

运行此命令后,~/project 目录中将创建一个名为 images.tar 的文件。该文件包含 hello-worldalpine 两个 Docker 镜像。

你可以使用 ls -lh 命令验证文件是否已创建并检查其大小。由于它包含两个镜像,所以其大小会比上一步中的 hello-world.tar 文件更大。

ls -lh images.tar

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex ... images.tar

为了确认归档文件中包含了两个镜像,你可以使用 tar -tf 命令列出 tar 文件的内容。

tar -tf images.tar

输出应该显示与两个镜像相关的文件,包括它们的清单和层数据。你应该会看到类似 hello-world/alpine/ 这样的条目。

...
hello-world/
hello-world/manifest.json
...
alpine/
alpine/manifest.json
...

现在可以使用 docker load 将这个单一的 tar 文件用于在另一个系统上加载这两个镜像。

保存镜像的特定平台变体

在这一步中,你将学习如何保存 Docker 镜像的特定平台变体。Docker 镜像可以针对不同的架构(如 amd64arm64 等)进行构建。有时,你可能需要保存专门为特定平台构建的镜像。

默认情况下,docker pulldocker save 操作的是与你当前系统架构匹配的镜像变体。不过,你可以使用 --platform 标志指定不同的平台。

让我们拉取一个有不同平台变体的镜像。alpine 镜像就是一个很好的例子。我们将明确拉取 alpine 镜像的 arm64 变体,即使你的 LabEx 虚拟机可能是 amd64 架构。

docker pull --platform arm64 alpine

你应该会看到表明正在拉取 alpine 镜像的 arm64 变体的输出。

arm64: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

现在,让我们将 alpine 镜像的这个特定 arm64 变体保存到一个 tar 归档文件中。我们将在 docker save 命令中再次使用 --platform 标志。

我们将把 alpinearm64 变体保存到 ~/project 目录中一个名为 alpine_arm64.tar 的文件中。

docker save --platform arm64 -o alpine_arm64.tar alpine

运行此命令后,~/project 目录中将创建一个名为 alpine_arm64.tar 的文件。该文件包含 alpine Docker 镜像的 arm64 变体。

你可以使用 ls -lh 命令验证文件是否已创建。

ls -lh alpine_arm64.tar

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex ... alpine_arm64.tar

为了确认保存的镜像确实是 arm64 变体,你可以检查 tar 文件的内容。虽然直接从 tar 文件内容验证架构比较复杂,但你在保存操作中使用了 --platform arm64 这一事实确保了保存的镜像适用于该平台。

这展示了如何明确保存与你主机架构不同的平台的镜像。

保存镜像并使用 gzip 进行压缩

在这最后一步中,你将学习如何将 Docker 镜像保存到一个 tar 归档文件中,并同时使用 gzip 对其进行压缩。这是一种常见的做法,可减小保存镜像的文件大小,使其更易于存储和传输。

docker save 命令本身没有内置的压缩标志。不过,你可以通过将 docker save 的输出通过管道传递给像 gzip 这样的压缩工具来实现压缩。

我们将保存 alpine 镜像(你应该在前面的步骤中已经拉取过),并使用 gzip 对其进行压缩。输出将被重定向到一个扩展名为 .tar.gz 的文件中。

语法涉及通过管道传递输出:docker save <image_name> | gzip > <output_file.tar.gz>

让我们将 alpine 镜像保存到 ~/project 目录中一个名为 alpine.tar.gz 的 gzip 压缩 tar 文件中。

docker save alpine | gzip > alpine.tar.gz

此命令将 alpine 镜像保存到标准输出,将该输出通过管道传递给 gzip 命令进行压缩,然后将压缩后的输出重定向到文件 alpine.tar.gz 中。

运行此命令后,~/project 目录中将创建一个名为 alpine.tar.gz 的文件。

你可以使用 ls -lh 命令验证文件是否已创建并检查其大小。将其大小与未压缩的 alpine 镜像大小(它是 images.tar 的一部分,或者如果你单独保存它的话)进行比较,以查看压缩效果。

ls -lh alpine.tar.gz

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex ... alpine.tar.gz

为了确认该文件是一个 gzip 压缩的 tar 归档文件,你可以使用 file 命令。

file alpine.tar.gz

输出应该表明它是一个 gzip 压缩的数据文件。

alpine.tar.gz: gzip compressed data, ...

你还可以使用 tar -tfz 列出压缩归档文件的内容。z 标志告诉 tar 在列出内容之前使用 gzip 对文件进行解压缩。

tar -tfz alpine.tar.gz

你应该会看到归档文件中 alpine 镜像的内容,类似于你列出 images.tar 内容时的情况。

...
alpine/
alpine/manifest.json
...

这种方法可以通过一条命令高效地保存和压缩镜像。

总结

在本次实验中,你学习了如何使用 docker save 命令将 Docker 镜像导出为 tar 归档文件。你成功地将单个镜像(hello-world)保存到一个 tar 文件中,展示了该命令的基本用法。

此外,你还探索了如何将多个镜像保存到一个归档文件中,这对于打包镜像很有用。你还学习了如何保存镜像的特定平台变体,以及如何使用 gzip 压缩输出的 tar 文件以减小文件大小。这些步骤涵盖了 docker save 在镜像备份和传输方面的基本功能。