在我们将更新导出为镜像后,就可以开始迁移镜像的工作了。
由于 Docker 是以集中的方式管理镜像的,所以在迁移之前,我们要先从 Docker 中取出镜像。docker save 命令可以将镜像输出,提供了一种让我们保存镜像到 Docker 外部的方式。

  1. sudo docker save webapp:1.0 > webapp-1.0.tar

在默认定义下,docker save 命令会将镜像内容放入输出流中,这就需要我们使用管道进行接收 ( 也就是命令中的 > 符号 ),这属于 Linux 等系统控制台中的用法,这里我们不做详细讲解。
管道这种用法有时候依然不太友好,docker save 命令还为我们提供了 -o 选项,用来指定输出文件,使用这个选项可以让命令更具有统一性。

  1. sudo docker save -o ./webapp-1.0.tar webapp:1.0

在镜像导出之后,我们就可以找到已经存储镜像内容的 webapp-1.0.tar 这个文件了。有兴趣的朋友,可以使用解压软件查看其中的内容,你会看到里面其实就是镜像所基于的几个镜像层的记录文件。

导入镜像

我们可以通过很多种方式将导出的镜像文件复制到另一台机器上,在这么操作之后,我们就要将镜像导入到这台新机器中运行的 Docker 中。
导入镜像的方式也很简单,使用与 docker save 相对的 docker load 命令即可。

  1. sudo docker load < webapp-1.0.tar

相对的,docker load 命令是从输入流中读取镜像的数据,所以我们这里也要使用管道来传输内容。当然,我们也能够使用 -i 选项指定输入文件。

  1. sudo docker load -i webapp-1.0.tar

镜像导入后,我们就可以通过 docker images 看到它了,导入的镜像会延用原有的镜像名称。

批量迁移

通过 docker save 和 docker load 命令我们还能够批量迁移镜像,只要我们在 docker save 中传入多个镜像名作为参数,它就能够将这些镜像都打成一个包,便于我们一次性迁移多个镜像。

  1. sudo docker save -o ./images.tar webapp:1.0 nginx:1.12 mysql:5.7

装有多个镜像的包可以直接被 docker load 识别和读取,我们将这个包导入后,所有其中装载的镜像都会被导入到 Docker 之中。