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

苏南大叔的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相关经验文字,请点击下面的链接查看。

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

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

打赏领取小礼物

打赏任意金额,发送截图到邮箱 shang@newsn.net ,可以领取精选回馈如下(任选其一):
  • 《前端视频教程大礼包》一套
  • 《wordpress精选皮肤》一套
  • 《dedecms织梦精选模板》一套
感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!

岁月静好

关注互联网发展,关注苏南大叔的《程序如此灵动~》博客
本文章来自:程序如此灵动~
博客地址为:https://newsn.net/
原文地址为:https://newsn.net/say/docker-share-image.html
上一篇好文:未知docker镜像(容器)分析,docker inspect命令使用指南
下一篇好文:如何推送docker镜像到阿里云的docker仓库服务?

如果您转载了本文章,出于某种原因,并没有注明作者或者出处。
在这里,苏南大叔也表示理解和支持。因为苏南大叔深深地明白:
您会在合适的时机,合适的地方,给本博客一个外链。对吧?
您若开心,便是安好!岁月静好,但愿世界和平,没有纷争~