概述

假设我们需要共享本地机器上的Docker镜像。为了解决这个问题,Docker Hub提供了解决方案。

Docker Hub 是一个基于云的中央仓库,用于存储 Docker 镜像。因此,我们只需要将 Docker 镜像推送到Docker Hub,之后任何人都可以拉取相同的 Docker 镜像。

作为基于云的仓库,Docker Hub 需要额外的网络带宽来上传和下载 Docker 镜像。随着镜像大小的增加,上传/下载所需的时间也会增加。因此,这种共享 Docker 镜像的方法并非总是有用的。

在本教程中,我们将讨论一种不使用Docker Hub来共享 Docker 镜像的方法。当发送者和接收者连接到同一私有网络时,这种方法非常实用。

保存 Docker 镜像为 tar 归档

假设有一个名为baeldung的Docker镜像,我们需要从机器A传输到机器B。为了实现这一目标,首先,我们将使用 docker save 命令将 Docker 镜像转换为 .tar 文件:

$ docker save --output baeldung.tar baeldung

上述命令将创建一个名为baeldung.tar的 tar 归档文件。另外,我们也可以使用文件重定向来实现类似的结果:

$ docker save baeldung > baeldung.tar

[docker save 命令可以使用多个Docker镜像创建单个 tar 归档:

$ docker save -o ubuntu.tar ubuntu:18.04 ubuntu:16.04 ubuntu:latest

传输 tar 归档

我们创建的 tar 归档位于机器A上。现在,让我们通过使用 scp 或 ftp 协议baeldung.tar 文件传输到机器B。我们可以使用诸如 scpftp 的协议。

此步骤高度灵活,并且在机器A和机器B所在的环境方面依赖性很大。

tar 归档加载到 Docker 镜像中

到目前为止,我们已经创建了 Docker 镜像的 tar 归档,并将其移动到了目标机器B上。

接下来,我们将使用 docker load 命令从 tar 归档 baeldung.tar 创建实际的 Docker 镜像:

$ docker load --input baeldung.tar 
Loaded image: baeldung:latest

同样,我们也可以从文件使用重定向将 tar 归档转换:

$ docker load < baeldung.tar
Loaded image: baeldung:latest

让我们现在通过运行 docker images 命令验证镜像是否成功加载:

$ docker images
baeldung                                        latest                            277bcd6563ce        About a minute ago       466MB

注意,如果 Docker 镜像 baeldung 已经存在于目标机器(例如,我们的示例中的机器B)上,则 docker load 命令会将现有镜像的标签更改为空字符串

$ docker load --input baeldung.tar 
cfd97936a580: Loading layer [==================================================>]  466MB/466MB
The image baeldung:latest already exists, renaming the old one with ID sha256:
  277bcd6563ce2b71e43b7b6b7e12b830f5b329d21ab690d59f0fd85b01045574 to empty string

缺点

使用这种方法,我们失去了重新使用 Docker 镜像缓存层的自由。因此,每次运行 docker save 命令时,它都会创建整个 Docker 镜像的 tar 归档。

另一个缺点是我们需要手动维护 Docker 镜像版本,通过保存所有 tar 归档。

因此,建议在测试环境中或当我们受限于Docker Hub访问权限时使用此方法。

结论

在本教程中,我们学习了 docker savedocker load 命令以及如何使用这些命令传输 Docker 镜像。

我们也讨论了涉及的缺点以及在这种方法可能证明有效的理想情况。