0. 概述
在使用 Docker 的时候,我们多多少少总是会遇到一些网络问题,除了使用代理之外,其实在工业上导入导出也是一个常见的套路,本文就将介绍 Docker 进行备份和恢复镜像的不同方式以及他们之间的差异对比。
1. 备份恢复方式介绍
备份可以分为两种形式,一种是直接将一个 Docker 镜像备份为文件,然后进行转移;另外一种是将运行中的容器保存为文件,这个我一般在懒得写 Dockerfile build 一个镜像的时候用。
然后恢复镜像有两种方法,分别是 load 和 import,区别在于:
- load:只能从标准输入或者文件中加载镜像备份,但是没法指定镜像的名字和标签,可以同时导入多个镜像;
- import:除了标准输入和文件,还支持从 URL 导入,需要指定镜像的名字和标签,并且只能导入一个镜像;
所以可以发现 Docker 有很奇怪的设计,往往两个功能类似的命令,只是一些输入或者输出不太一样。下面就演示一下如何真实操作 Docker 的镜像。
2. 备份镜像
首先是备份镜像,备份镜像的操作很简单,直接这些写就可以了:
[root@liqiang.io]# docker save alpine:3.10.0 -o /tmp/alpine.3.10.0.tar.gz
[root@liqiang.io]# ll /tmp/alpine.3.10.0.tar.gz
-rw------- 1 root root 5.6M Jan 20 22:36 /tmp/alpine.3.10.0.tar.gz
可以发现已经简单地导出来了,save 还支持同时导出多个镜像,例如:
[root@liqiang.io]# docker save alpine:3.10.0 golang:1.13 -o /tmp/golang-dev.tar.gz
[root@liqiang.io]# ll /tmp/golang-dev.tar.gz
-rw------- 1 root root 791M Jan 20 22:39 /tmp/golang-dev.tar.gz
这是 save 镜像的方式,如果你想要将一个容器保存为文件,那么可以使用 export:
[root@liqiang.io]# docker export e055297dc8c8 -o mongo.4.1.9.tar.gz
[root@liqiang.io]# ll ./mongo.4.1.9.tar.gz
-rw------- 1 root root 343M Jan 20 04:35 ./mongo.4.1.9.tar.gz
然后就可以像镜像一样恢复到 Docker 中了。
3. 恢复镜像
当有了备份的镜像之后,下一步就是将备份镜像导入回来了。前面说了,导入有两种方式,分别是 load 和 import,差别前面也说了,这里就直接示例一下:
[root@liqiang.io]# docker load -i ./golang-dev.tar.gz
256a7af3acb1: Loading layer [==================================================>] 5.844MB/5.844MB
Loaded image: alpine:3.10.0
f2b4f0674ba3: Loading layer [==================================================>] 119.2MB/119.2MB
7f9bf938b053: Loading layer [==================================================>] 17.11MB/17.11MB
423d63eb4a27: Loading layer [==================================================>] 17.85MB/17.85MB
bee1c15bf7e8: Loading layer [==================================================>] 149.8MB/149.8MB
02c991ab8711: Loading layer [==================================================>] 184.3MB/184.3MB
9f18195bd2dc: Loading layer [==================================================>] 335.2MB/335.2MB
2a7e742dfe0f: Loading layer [==================================================>] 2.56kB/2.56kB
Loaded image: golang:1.13
可以看到,这里一次性就导入了两个镜像,并且直接指定备份的文件就可以了,都不用指定 tag 了。再来看看 import:
[root@liqiang.io]# docker import /tmp/alpine.3.10.0.tar.gz alpine:3.10.1
sha256:fe04f53a86c8a8a92f66745380658fe425688c34c97a9f53414cee001c9983e6
[root@liqiang.io]# docker images | grep fe04f53a86c8
alpine 3.10.1 fe04f53a86c8 25 seconds ago 5.85MB
OK,这也成功导入到 Docker 中了,可以直接当作本地镜像直接使用了。