# Docker 入门实践(4): 不通过 registry 共享镜像
有些时候我们希望不通过 Docker hub 或者私有的 registry 就能共享、传输镜像。比如在内部测试的时候,希望能够通过 ftp、scp 等简单的文件传输即可完成镜像的共享。
下面将介绍如何将镜像文件打包成 tar 压缩文件,以及如何将该 tar 文件加载为镜像。
# 使用 docker save & docker load
# 使用 docker save 将镜像输出为归档文件
docker save (opens new window) 可用于保存一个或多个镜像为归档文件,默认使用的是标准输出流。该归档文件同时保存了镜像的 layers、tags、versions 等。
使用方法如 docker save [OPTIONS] IMAGE [IMAGE...]。
还使用之前的 hello-docker 镜像为例,执行:
docker save hello-docker > hello-docker.tar
或:
docker save --output hello-docker.tar hello-docker
执行成功之后,可以看见当前目录多了一个名为 hello-docker.tar 的文件。
# 使用 docker load 加载归档文件为镜像
通过上一步骤我们得到了一个 tar 归档文件,这时候可以将该文件用自己喜欢的方式传输至任意主机,然后通过 docker load (opens new window) 来加载该归档文件为镜像。
执行下方命令:
docker load < hello-docker.tar
或者:
docker load --input hello-docker.tar
成功之后执行 docker images 可以看见 hello-docker 镜像。有了镜像文件之后就可以跟往常一样通过镜像启动我们的容器了。
# 使用 docker export & docker import
# 使用 docker export 将容器输出为归档文件
docker export (opens new window) 能够将容器文件系统输出为归档文件。docker export 不会输出与容器相关联的 volumes(卷)的内容。比如一个卷挂载在一个容器中,docker export 只会输入该容器卷的目录,但是不包含该目录的内容。
执行如下命令:
docker export [容器名] > hello-docker.tar
或:
docker export --output="hello-docker.tar" [容器名]
执行成功之后,可以看到 hello-docker.tar 文件。
# 使用 docker import 导入归档文件为镜像
docker import (opens new window) 能够将归档的压缩文件导入为镜像。
执行下方命令,可以发现多了一个没有标记的镜像,其 REPOSITORY 和 TAG 都为 none。
docker import hello-docker.tar
为了方便查找一般使用该命令的时候都会为其指定标记,如下:
docker import hello-docker.tar new-image:latest
或者使用管道操作从标准输出流导出。
cat hello-docker.tar | docker import - new-image:latest
执行成功之后可以发现对一个 new-image:latest 的镜像。
# docker save VS docker export
docker save的操作对象是镜像,而docker export的操作对象是容器。docker save能够保存镜像的layers、tags、versions等信息,而docker export只是输出容器的快照而已,不包含layers、tags、versions等信息。(这一点可以通过docker history查看双方产生的镜像历史层不同可确认)。
# docker load VS docker import
docker load一般用于加载docker save的产物,而docker import一般用于加载docker export的产物。- 因为
docker save的产物带有layers、tags、versions等信息,所以docker load只需指定文件无需额外参数即可产生一样的镜像文件。而docker export的产物不带上述信息,所以使用docker import的时候能指定镜像名称 &tag,以及能够通过--change参数将新的Dockerfile指令应用于创建的镜像中。