我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔的docker系列入门教程,开始讲述对docker镜像的分享(导入导出)操作。如果你本机有个稀有的镜像,想分享给你的好基友,那么该如何操作呢?

苏南大叔:如何分享docker镜像,镜像导入和导出语句对比最佳实践 - dockerfriends
如何分享docker镜像,镜像导入和导出语句对比最佳实践(图1-1)

关于这种镜像分享操作,一共有两组命令,各自适用的场景是不同的。苏南大叔分别叙述如下:

镜像和容器概念对比

在阅读本文的操作之前,必须弄明白镜像和容器的概念区别。当然,苏南大叔在之前的文章中,也有描述。这里就简要的复述一下,镜像和容器的区别。

  • 镜像是容器的基础,可以简单的理解为:镜像是我们启动虚拟机时需要的系统盘。查看镜像列表的命令是:docker images
  • 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。查看容器列表的命令是:docker ps -a

镜像和容器都可以导出为.tar包。大家可以把导出镜像操作理解为:复制一个正版的window安装盘。对比的说的话,对于容器的导出操作,则可以理解为:对于一个已经安装好,安了各种软件后的系统,ghost一个新的镜像。当然,这个是苏南大叔的理解啊,官方并没有这个说法。

镜像=>镜像:docker savedocker load

docker save <image_name>可以把一个docker镜像导出为文件<image_file.tar>,对应的导入语句是:docker load <image_file.tar>`命令,再次把对应的.tar文件导入为镜像。无损,完美还原。(镜像=》.tar`文件=》镜像)

docker save <image_id> -o <name>.tardocker save的结果是个tar包,使用-o参数指定名字。这个-o参数是必须指定的。<image_id>可以通过docker images命令来获得。

docker save 03b35d3aa19a -o aaa.tar
docker load -i aaa.tar

容器=>镜像:docker exportdocker import

这组命令中,docker export <container_id>这个命令操作的是容器,把这个容器导出为一个.tar文件。可以再使用docker import <image_file.tar>命令导入该.tar文件,为一个镜像。

docker exportdocker 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 exporttar包,然后再导入镜像呢?理论上应该是可以的,待测试

导入操作对比:docker importdocker 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。并且没有repotag,可以使用docker tag命令改名,例如:

docker tag c8435e2195b9 cc:dd

上述的镜像的地址会是cctagdd

更多详细内容可以参见: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相关经验文字,请点击下面的链接查看。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   docker