Docker镜像的优化

镜像的优化

优化镜像其实就是在能保证镜像想要的作用的前提下,尽量减小镜像的大小,节省资源。
优化镜像有几种途径
注意:必须是在保证镜像作用的前提下进行优化

  • base镜像的选择尽量精简
  • RUN命令的使用尽量少(因为一个RUN命令就会建立一层自定义镜像层)
  • 清理不必要的镜像构建的中间产物(如不需要的文件、压缩包、目录等等)
  • 尽量使用构建缓存(这样多个镜像只需要共享同一个镜像层,并且构建速度很快)
  • 优化网络请求(也是为了提高构建的速度)
  • 使用多阶段构建镜像

下面通过实际操作来展示镜像是如何被优化的,这里我假设想要的是能够运行nginx服务的功能的镜像。

构建未优化的镜像

为了方便看出优化的效果,这里先构建出一个没有优化过的镜像。
这里用了一个140M大的基础镜像rhel7,由于需要装nginx,而装nginx时需要在yum仓库下载一些依赖性软件,所以需要给镜像中配置yum仓库,和在宿主机安装是一样的(nginx如何安装在这里不再赘述,需要了解请翻之前的博客)。

  • 在构建目录中放入进行操作需要用到的文件和nginx压缩包,这里的madao.repo是用来配置yum仓库的,我已经配置好了网络yum源,可以直接使用。
    在这里插入图片描述
    修改好了合适的dockerfile文件,已经在图中标注出了各命令的用处。
    在这里插入图片描述
    使用docker build构建镜像,会按照dockerfile自动安装nginx依赖性软件,进行编译和安装nginx,过程比较长,这里就不贴过程图了。
    在这里插入图片描述
    可以看到没有优化的镜像为302M比基础镜像大了162M
    在这里插入图片描述

1、清理不必要的中间产物

清理镜像构建的中间产物,来达到缩减镜像大小的目的。

  • 修改了一下dockerfile文件,yum仓库使用完后可以清空yum仓库来缩减大小,所以加了yum clean all。在安装完nginx后,安装时所用的目录就用不上了,可以删除/mnt/nginx-1.17.0,来缩减镜像大小。
    在这里插入图片描述
    用新的dockerfile文件构建了清理中间产物而优化后的镜像。
    在这里插入图片描述
    查看镜像,与优化前的镜像对比,此时优化后只有276M,比未优化的302M小了26M。
    在这里插入图片描述

2、减少RUN命令的使用

由于每一个RUN命令就会使镜像的自定义镜像层增加一层,所以可以尽量将需要用到RUN命令的操作写到同一个RUN中,这样多个RUN就能合并为一个,操作没有变化,但镜像层减少了,就能缩减镜像的大小

  • 合并RUN的操作很简单,把按照逻辑可以连续执行的操作放在同一个RUN中,在操作之间用”&&”连接起来即可合并。注意这里一定是要在逻辑上可以连续执行的操作才行,不能打乱顺序,否则会出现逻辑问题。
    在这里插入图片描述
    再用修改后的dockerfile文件构建新镜像,此时这个镜像经过了清理中间产物和减少RUN命令使用的优化
    在这里插入图片描述
    查看镜像,对比大小,发现减少了RUN命令使用后的镜像,大小又减小了一些。
    在这里插入图片描述

3、使用多阶段构建镜像

由于安装nginx时需要安装一些依赖性软件等,对系统改动较大,所以可以将构建镜像的过程分为多个阶段,比如此处简单分为两个阶段
阶段一:该阶段主要用于通过正常的步骤安装nginx,生成需要的nginx二进制文件。安装过程对系统改动较大,会占用很多空间,所以阶段一主要作为生成二进制文件的构建的中间产物,而不作为最终生成的镜像使用
阶段二:将阶段一生成的二进制文件拷贝到阶段二中,这样阶段二就不需要改动系统,只得到二进制文件即可,所以将阶段二生成的镜像作为最终生成的镜像

  • 为了使用缓存,加快构建的速度,所以这里不对阶段一部分进行改动
    上半部分为第一阶段,生成nginx二进制文件。需要指出FROM rhel7 as build,意为第一阶段使用的基础镜像为rhel7镜像,生成的中间产物称为build
    下半部分为第二阶段,将文件拷贝过来即可。拷贝时指出–from=build,意为是从中间产物build中拷贝文件或目录。
    在这里插入图片描述
    使用该dockerfile构建新镜像。
    在这里插入图片描述
    查看镜像,可以发现新镜像只有144M,远比其他优化方式效率高得多,基础镜像140M,也就是说新镜像添加的部分只有4M之大
    在这里插入图片描述

4、选择精简的base镜像

若基础镜像小,构建出来的新镜像就有很大的优势,毕竟新镜像是要在基础镜像之上进行操作的。
假设基础镜像只有20M,即使新镜像增加的内容有40M,那么最终的新镜像大小也只有60M
而若基础镜像有200M,即使新镜像增加的内容只有4M,那么最终的新镜像大小也有204M
所以说选择尽量精简的基础镜像是非常至关重要的


版权声明:本文为weixin_43238194原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。