如何分享docker镜像,镜像导入和导出语句对比最佳实践
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔的docker
系列入门教程,开始讲述对docker
镜像的分享(导入导出)操作。如果你本机有个稀有的镜像,想分享给你的好基友,那么该如何操作呢?
关于这种镜像分享操作,一共有两组命令,各自适用的场景是不同的。苏南大叔分别叙述如下:
镜像和容器概念对比
在阅读本文的操作之前,必须弄明白镜像和容器的概念区别。当然,苏南大叔在之前的文章中,也有描述。这里就简要的复述一下,镜像和容器的区别。
- 镜像是容器的基础,可以简单的理解为:镜像是我们启动虚拟机时需要的系统盘。查看镜像列表的命令是:
docker images
。 - 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。查看容器列表的命令是:
docker ps -a
。
镜像和容器都可以导出为.tar
包。大家可以把导出镜像操作理解为:复制一个正版的window安装盘。对比的说的话,对于容器的导出操作,则可以理解为:对于一个已经安装好,安了各种软件后的系统,ghost
一个新的镜像。当然,这个是苏南大叔的理解啊,官方并没有这个说法。
镜像=>镜像:docker save
与docker load
docker save <image_name>
可以把一个docker
镜像导出为文件<image_file.tar>
,对应的导入语句是:docker load
<image_file.tar>`命令,再次把对应的
.tar文件导入为镜像。无损,完美还原。(镜像=》
.tar`文件=》镜像)
docker save <image_id> -o <name>.tar
,docker save
的结果是个tar
包,使用-o
参数指定名字。这个-o
参数是必须指定的。<image_id>
可以通过docker images
命令来获得。
docker save 03b35d3aa19a -o aaa.tar
docker load -i aaa.tar
容器=>镜像:docker export
和docker import
这组命令中,docker export <container_id>
这个命令操作的是容器
,把这个容器导出为一个.tar
文件。可以再使用docker import <image_file.tar>
命令导入该.tar
文件,为一个镜像。
docker export
和docker import
这组命令(容器=》.tar
文件=》镜像),是把一个容器导出为镜像文件,再把一个镜像文件导入为镜像,会丢失所有元数据及历史记录,有损操作。当然了,如果你对历史操作,并不关心的话,这组命令完全ok。省心省力。
docker c8435e2195b9 export -o test3.tar
docker import test3.tar
docker import test3.tar <repo>:<tag>
docker import
命令得到的镜像名字和tag可能都是<repo>
和<tag>
。可以重复导入,会生成不同的imagesid。可以使用docker tag
命令对镜像进行改名。
导出操作对比:docker export
对比docker save
docker save
命令操作的是镜像,无损导出,会保留镜像的一些操作历史记录。docker save
的包更大一些。据说,是因为docker save
的包,包含了镜像历史
的原因。docker save
的.tar
包打开之后,是镜像的目录格式,和大家想象的不一样。docker export
命令操作的是容器,会丢失所有元数据及历史记录,仅仅保留容器当时的状态,就像虚拟机快照一样。docker export
得到的tar
包更小一些。docker export
的.tar
包,里面打开之后,是centos
的基本结构目录。
所以,对于镜像的修改,这里是不是有可能,直接修改docker export
的tar
包,然后再导入镜像呢?理论上应该是可以的,待测试
导入操作对比:docker import
和docker load
docker import
的操作对象,可以是docker save
的结果,也可以是docker export
的结果。两种格式都是可以识别的。但是两者导入的镜像size,是不同的。这个,苏南大叔就不详细描述原因了。
docker load
只能操作docker save
得到的.tar
包,不能操作docker import得到的.
tar`包,会有如下类似报错信息:
open /var/lib/docker/tmp/docker-import-337985932/app/json: no such file or directory
多次docker load
只会生成同一个imageid
。并且没有repo
和tag
,可以使用docker tag
命令改名,例如:
docker tag c8435e2195b9 cc:dd
上述的镜像的地址会是cc
,tag
是dd
。
更多详细内容可以参见:https://newsn.net/say/docker-images.html
更多语法变形
还可以使用>
和<
操作这些命令,下面的是一些例子。
docker save 409cf62f1705 > test9.tar
docker export ca818c38a722 > 11.tar
docker load < test3.tar
cat test3.tar | docker import - repo:tag
docker镜像的实际存储目录对比tar
包
如果您的宿主机,也是centos
系统的话,那么不妨查看一下,宿主机上的这个目录。对应的的目录结构和docker save
命令,得到的.tar
包相比,目录结构是类似的。
ls /var/lib/docker/containers/
上述目录下面存放的是容器信息,每个容器的id实际上,对应于容器目录的前几位。大家可以对比查看这个命令。
docker ps -a
结束语
这些内容,都是苏南大叔自己总结的,应该是挺实用的内容。如果您觉得本篇文章实用,欢迎大家转载该内容,请注明文章链接。谢谢。
更多docker
相关经验文字,请点击下面的链接查看。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。