0. 概述

在使用 Docker 的时候,我们多多少少总是会遇到一些网络问题,除了使用代理之外,其实在工业上导入导出也是一个常见的套路,本文就将介绍 Docker 进行备份和恢复镜像的不同方式以及他们之间的差异对比。

1. 备份恢复方式介绍

备份可以分为两种形式,一种是直接将一个 Docker 镜像备份为文件,然后进行转移;另外一种是将运行中的容器保存为文件,这个我一般在懒得写 Dockerfile build 一个镜像的时候用。

然后恢复镜像有两种方法,分别是 load 和 import,区别在于:

所以可以发现 Docker 有很奇怪的设计,往往两个功能类似的命令,只是一些输入或者输出不太一样。下面就演示一下如何真实操作 Docker 的镜像。

2. 备份镜像

首先是备份镜像,备份镜像的操作很简单,直接这些写就可以了:

  1. [root@liqiang.io]# docker save alpine:3.10.0 -o /tmp/alpine.3.10.0.tar.gz
  2. [root@liqiang.io]# ll /tmp/alpine.3.10.0.tar.gz
  3. -rw------- 1 root root 5.6M Jan 20 22:36 /tmp/alpine.3.10.0.tar.gz

可以发现已经简单地导出来了,save 还支持同时导出多个镜像,例如:

  1. [root@liqiang.io]# docker save alpine:3.10.0 golang:1.13 -o /tmp/golang-dev.tar.gz
  2. [root@liqiang.io]# ll /tmp/golang-dev.tar.gz
  3. -rw------- 1 root root 791M Jan 20 22:39 /tmp/golang-dev.tar.gz

这是 save 镜像的方式,如果你想要将一个容器保存为文件,那么可以使用 export:

  1. [root@liqiang.io]# docker export e055297dc8c8 -o mongo.4.1.9.tar.gz
  2. [root@liqiang.io]# ll ./mongo.4.1.9.tar.gz
  3. -rw------- 1 root root 343M Jan 20 04:35 ./mongo.4.1.9.tar.gz

然后就可以像镜像一样恢复到 Docker 中了。

3. 恢复镜像

当有了备份的镜像之后,下一步就是将备份镜像导入回来了。前面说了,导入有两种方式,分别是 load 和 import,差别前面也说了,这里就直接示例一下:

  1. [root@liqiang.io]# docker load -i ./golang-dev.tar.gz
  2. 256a7af3acb1: Loading layer [==================================================>] 5.844MB/5.844MB
  3. Loaded image: alpine:3.10.0
  4. f2b4f0674ba3: Loading layer [==================================================>] 119.2MB/119.2MB
  5. 7f9bf938b053: Loading layer [==================================================>] 17.11MB/17.11MB
  6. 423d63eb4a27: Loading layer [==================================================>] 17.85MB/17.85MB
  7. bee1c15bf7e8: Loading layer [==================================================>] 149.8MB/149.8MB
  8. 02c991ab8711: Loading layer [==================================================>] 184.3MB/184.3MB
  9. 9f18195bd2dc: Loading layer [==================================================>] 335.2MB/335.2MB
  10. 2a7e742dfe0f: Loading layer [==================================================>] 2.56kB/2.56kB
  11. Loaded image: golang:1.13

可以看到,这里一次性就导入了两个镜像,并且直接指定备份的文件就可以了,都不用指定 tag 了。再来看看 import:

  1. [root@liqiang.io]# docker import /tmp/alpine.3.10.0.tar.gz alpine:3.10.1
  2. sha256:fe04f53a86c8a8a92f66745380658fe425688c34c97a9f53414cee001c9983e6
  3. [root@liqiang.io]# docker images | grep fe04f53a86c8
  4. alpine 3.10.1 fe04f53a86c8 25 seconds ago 5.85MB

OK,这也成功导入到 Docker 中了,可以直接当作本地镜像直接使用了。