Docker镜像压缩与优化

来源:互联网 发布:南昌宝德网络是干嘛的 编辑:程序博客网 时间:2024/05/22 17:31

        现如今docker如此受人追捧,主要是因为它的轻量化、可以快速部署以及资源的利用。但是一个docker images质量的好与坏,主要取决于Dockerfile编写的质量。同样功能的镜像,但是不同的Dockerfile build出来的镜像大小是不一样的,这是因为docker是由一层一层的只读层累积起来的,而这每一层就是Dockerfile中的每一条指令,所以Docker image的大小完全取决于Dockerfile中的每条指令生成的中间层的大小,下面我们来举一个小例子来详细说明dockerimage的形成。

       我们有一个Dockerfile:

FROM Ubuntu:14.04ADD run.sh /VOLUME /dataCMD [“./run.sh”]

       这个简单的Dockerfile主要做的事情是:基于Ubuntu:14.04系统将run.sh放在根目录下,设置卷挂载点,然后在image启动的时候run脚本run.sh。下图就是形成的docker image:


很明显,由图我们可以看到,四条指令分别形成四个层,假设Ubuntu:14.04是150MB,run.sh是1MB的话,那么FROM Ubuntu:14.04层的大小就是150MB,ADD run.sh /层的大小即为1MB,而VOLUME /data层和CMD [“./run.sh”]由于没有加入文件等数据,也没有在系统中生成数据,所以该层的大小为0。所以整个image的大小就是151MB。在知道了docker image生成的原理之后,下面我们就来聊一下docker镜像的优化与压缩。

需要说明的一点就是层数的多少在某些情况下是不会决定image的大小的,只有当Dockerfile中出现:

RUN yum install ***

RUN yum uninstall ***

的时候镜像是可以压缩优化的,因为上面这两句是安装一个工具,然后卸载掉,正常情况下我们感觉这样一安装一卸载大小就为0了,但是在docker image中不是这样的,RUN yum uninstall ***这一层只能是令上一层不可见,但是上一层的大小是不会变化的,所以,如果想达到0的效果,我们就需要将这两层压缩成一层,也就是这样写:

RUN yum install *** && \

     yumuninstall ***

这样就会达到压缩镜像的效果。

 所以,压缩镜像主要有两点

      1  选择一个较小的原镜像,也就是FROM后面的那个镜像尽量要小。

      2  根据实际情况对Dockerfile中的层进行合并,具体情况就是如上述所说的情况,要知道并不是随便合并层就会达到效果的。


注:以上均为个人观点,如有不对,还请各位大神指点    

原创粉丝点击