概述
假设我们需要共享本地机器上的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。我们可以使用诸如 scp 或 ftp 的协议。
此步骤高度灵活,并且在机器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 save 和 docker load 命令以及如何使用这些命令传输 Docker 镜像。
我们也讨论了涉及的缺点以及在这种方法可能证明有效的理想情况。