本文于2017年1月25号发布在个人博客中,因为个人博客关闭,全部迁移到CSDN,以下是正文:
1
办公室的氛围还是像以前一样,项目经理在电话上跟人争吵,程序员在电脑前码着代码,我在lxd的海洋中挣扎着,这已经是接到这个任务的第二天了,还是没有一个清晰的概念。正在这紧要的关头,主管给了我一个新的任务:docker镜像瘦身
我们的容器镜像是一层一层的叠起来的,现在有很多个镜像,这些镜像有很多公共的层,导出时每个镜像都会保存所有的层,这有相当大的冗余,现在我们要把这些重复的层去掉,达到瘦身的目的,具体可以跟k同事联系
我承认我很无知,麻烦哪位热心的大哥给我科普一下docker镜像是什么鬼?结构是什么样的?现状如何?意欲何为?没有前因后果,一个任务吭哧一下砸我头上了。你以为我会退缩?当然不会,我会先花尽量少的时间搞清楚他在讲什么
经过一番google搜索,总算是弄明白
docker image是建立在Aufs基础上的,Aufs是一种Union FS,
简单来说就是支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种layer的概念参考:
http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper/
2
弄懂问题之后鼓起勇气拨通了k同事的电话,先简单请教了一下任务背后的基础知识,k同事不厌其烦的告诉我:
我们的工具分两步(提供一个python脚本,通过参数来决定执行以下两个步骤之一):
- 打包。输入是一个文件夹,文件夹下有多个docker image,docker image是通过“docker save image_name
-o image_name.tar”导出的。每个docker image有多个layer,这些layer有很多是重复的,重复的部分只需要保存一份,以此来达到镜像瘦身的目的。- 解包。打包的逆过程
我们的使用场景是:
- 在镜像仓库使用“docker save image_name -o docker_image.tar”导出镜像
- 将导出的镜像文件通过gzip压缩并拷贝到目的主机上
- 在目的主机上通过gzip解压,“docker load -i image_name.tar”导入
- 通过“docker push”到私有仓库
- 再到需要使用docker image的节点上通过“docker run”启动docker container
工作这么久了,身边不乏优秀的同事,但还是第一次遇到把问题描述的如此清楚的。内心的那种愉悦、兴奋开始躁动起来了,我已经快控制不住自己了,好想一个大步跳到他身边,给他点无数多个赞,由于地域的限制我不得不放弃这样的想法,只是“平淡”的在输入框里发送了“东哥,讲的真详细,非常感谢!”
中国有句古话叫:“己所不欲,勿施于人”,我们何不更进一步,“己所欲,施于人”,做一个自己很喜欢的人
3
任务确定之后,开始着手整理需要用到的技术点:
- python获取命令行参数
- 遍历文件下的所有文件
- 删除.tar文件中重复的子文件/子文件夹
- 将多个文件打包成一个.tar包,.tar文件解压后是一个文件夹,文件夹下是多个镜像的.tar包
- 将一个不带压缩的.tar包使用gzip压缩
经过一天的奋战,打包的部分算是完成了,把代码拷贝到测试环境上开始验证。很自然的,我需要先准备测试数据,也就是我们的输入:“一个文件夹,文件夹下有多个docker save导出的.tar包”。
我的步骤是这样的:
- docker images
- docker save image1 -o image1.tar
- docker save image2 -o image2.tar
- docker save image3 -o image3.tar
- 这也太不方便了吧,要搞到什么时候?会不会docker save支持一次导出多个image呢?
-
docker help save
Save one or more images to a tar archive (streamed to STDOUT by default) -
不知道你们会怎么想,反正我的心情很复杂:
- 开心,因为我们要的功能社区已经支持了
- 觉得自己好傻,在没有调查清楚现状的情况下,急急忙忙开工,结果浪费了一天的时间
- 记住:“三思而后行”
4
这个任务还没完,打包和解包只是一系列步骤中的第一步,后面还有很多流程上的优化,这里就不一一讲了。
总结
记流水账不是目的,就像失败不是我们的目的一样,总结才是关键,为后续的工作、生活提供一些指导意见。
做一个自己喜欢的人
“林子大了,什么鸟都有”,我们身边各式各样的人都有,讨人厌的、平庸到毫无存在感的、优秀到闪瞎眼的。总会有一部分人的部分特点让你很喜欢,我们何不跟他学习,慢慢培养自己,让我们也同样拥有跟他们一样让人喜欢的特点呢?做一个自己喜欢的人,这样别人喜欢你的可能性就会越来越大了。
三思而后行
三思而后行,不是踌躇不前,而是在出行之前弄明白我们当前所处的位置以及我们要去的远方,有哪些限制条件,又有哪些可以帮助我们的条件。方向都错了,跑得快有什么用呢?