简介
在这个实验中,你将学习如何使用 docker save
命令将 Docker 镜像导出为 tar 归档文件。这是一项至关重要的技能,可用于备份镜像、在没有镜像仓库的系统之间传输镜像,或者将多个镜像打包以便分发。
你将探索保存单个镜像、将多个镜像保存到一个归档文件中、保存镜像的特定平台变体,以及使用 gzip 压缩保存的镜像归档文件。在本实验结束时,你将熟练掌握使用 docker save
进行各种镜像管理任务。
在这个实验中,你将学习如何使用 docker save
命令将 Docker 镜像导出为 tar 归档文件。这是一项至关重要的技能,可用于备份镜像、在没有镜像仓库的系统之间传输镜像,或者将多个镜像打包以便分发。
你将探索保存单个镜像、将多个镜像保存到一个归档文件中、保存镜像的特定平台变体,以及使用 gzip 压缩保存的镜像归档文件。在本实验结束时,你将熟练掌握使用 docker save
进行各种镜像管理任务。
在这一步中,你将学习如何将单个 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
命令加载它。
在上一步中,你学习了如何保存单个 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-world
和 alpine
镜像。你可以通过列出本地镜像来验证这一点:
docker images
输出应该在列表中显示 hello-world
和 alpine
。
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-world
和 alpine
镜像都保存到 ~/project
目录中一个名为 images.tar
的文件中。
docker save -o images.tar hello-world alpine
运行此命令后,~/project
目录中将创建一个名为 images.tar
的文件。该文件包含 hello-world
和 alpine
两个 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 镜像可以针对不同的架构(如 amd64
、arm64
等)进行构建。有时,你可能需要保存专门为特定平台构建的镜像。
默认情况下,docker pull
和 docker 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
标志。
我们将把 alpine
的 arm64
变体保存到 ~/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
这一事实确保了保存的镜像适用于该平台。
这展示了如何明确保存与你主机架构不同的平台的镜像。
在这最后一步中,你将学习如何将 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
在镜像备份和传输方面的基本功能。