Docker 提供了 docker save 和 docker load 命令,用以将镜像保存为一个文件,然后传输到另外一台主机上再进行加载操作。这是在没有可用镜像仓库的情况下获取镜像的方法。虽然可以实现镜像的获取,但仍然推荐使用镜像仓库进行管理和分发。

保存镜像

使用 docker save 命令可以将镜像保存为归档文件。 举例:将本地nginx镜像保存为文件,先看下镜像的名称

$ docker image ls nginx
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        1.19.8    b8cf2cbeabb9   3 years ago   133MB

导出镜像的命令

docker save nginx:1.19.8 -o nginx-1.19.8.tar
file nginx-1.19.8
nginx-1.19.8.tar: POSIX tar archive

这里导出文件的后缀可以为任意后缀名称,但文件本质都是归档文件。 注意,如果本地已经有同名的文件,执行命令则会对同名文件进行覆盖操作。

对归档文件进行压缩,则可以使用 gzip:

docker save nginx:1.19.8 | gzip > nginx-1.19.8.tar.gz

# 对比压缩前后文件大小
ls -lh nginx*
-rw-------. 1 root root 131M Aug  6 15:49 nginx-1.19.8.tar
-rw-r--r--. 1 root root  50M Aug  6 15:53 nginx-1.19.8.tar.gz
# 可以发现压缩之后不到未压缩的一半,可以提高文件传输的速度。

镜像加载

将保存的镜像归档文件传输至另外一台主机,使用如下命令进行镜像的导入操作:

$ docker load -i nginx-1.19.8.tar.gz
Loaded image: nginx:1.19.8

一条命令实现镜像文件迁移

借助ssh 和 pv,可以使用Linux管道命令,实现一条命令完成镜像从一台主机到另外一台主机间的迁移,并可以实时显示迁移进度。

docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
  • docker save <镜像名>: 这个部分是用来将指定的 Docker 镜像保存为一个 tar 归档文件。命令中的 <镜像名> 是你要保存的 Docker 镜像的名称或 ID。

  • | bzip2: 这个管道命令 (|) 将 Docker save 命令的输出传递给 bzip2 程序,用来进行数据压缩。bzip2 是一种常见的数据压缩工具,用于减小传输过程中的数据量。

  • | pv: pv 是一个进度条监视器,它可以显示数据流的传输进度。这个部分在整个数据流传输过程中,显示压缩后数据的传输进度。

  • | ssh <用户名>@<主机名> 'cat | docker load': 这部分是通过 SSH 将压缩后的数据流传输到远程主机。具体解释如下:

  • ssh <用户名>@<主机名>: 使用 SSH 协议连接到指定的远程主机,<用户名> 是你的远程主机用户名,<主机名> 是你的远程主机地址。 'cat | docker load': 在远程主机上,通过 SSH 连接执行的命令。cat 命令将通过 SSH 传输的数据流输出到标准输出,并通过管道传递给 docker load 命令。docker load 命令用来加载 Docker 镜像,将其恢复为可用的 Docker 镜像。

注意:命令正确执行需要本地安装了 bzip2 和 pv 两个软件。