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两个软件。
评论