Docker系列之9 Dockerfile编写优化

为什么要进行Dockerfile的优化?

在 Docker build 过程中,会占用 Dockerfile 并且在其自身临时的容器中一对一地运行每个可操作的指令。 结果是每个可操作的指令都有一个新映像层。Docker镜像应该是小而快的,如果不能构建一个良好的Dockerfile来帮助你提高构建缓存命中率,那么镜像构建过程将会变得相当的缓慢,并且镜像的体积将会很大。

如何进行优化Dockerfile

镜像体积最小化

1.基础镜像的选择:
常用的 Linux 系统镜像一般有 ubuntu、centos、debian,其中debian 更轻量,而且适用的用途很广。在运行某种应用例如PHP时,在业务需要满足下尽量适用官方的Docker镜像。
在这里插入图片描述
2.减少镜像层数:
在一个Dockerfile中每个命令都会在原来的基础上生成一层镜像,这毫无疑问将会对镜像增加体积,尽量将RUN命令进行组合,这将有效的减少镜像层数达到减少体积的效果。
优化前

RUN wget jdk-8u191-linux-x64.tar.gz
RUN tar zxvf jdk-8u191-linux-x64.tar.gz

  
 
  • 1
  • 2

优化后

RUN tar zxvf jdk-8u191-linux-x64.tar.gz && \
 mv jdk1.8.0_191 /usr/local/jdk

  
 
  • 1
  • 2

3.清除缓存和临时文件:
在镜像构建过程中,可能会适用apt-get或yum等方式进行包的安装,在完成后系统会残留一些不必要的文件,或者适用源代码进行编译某些应用时,源代码文件夹将会存放在镜像中,在镜像构建的最后步骤,可以将这些不必要的文件进行删除。

RUN rm -rf /usr/local/src/* && \ yum clean all 

  
 
  • 1
  • 2

4.镜像服务化:
当有多个服务时,分开多个镜像去运行这些服务,各司其职,例如在同一个镜像中打包了Apache httpd、MySQL、PHP,这无疑造成该镜像耦合性太差且体积臃肿。建议采用不同的镜像去托管不同的应用。

构建速度最快化

5.构建缓存:
在构建过程中,如果可以利用到缓存无疑将提升构建的速度,缓存的触发原则是单个指令的内容没有变化,则Docker构建时就会默认去使用缓存。我们可以通过将一些不变的操作独立成单独的指令,这样在构建时只会对有产生变化的指令构建,而不变的指令将会使用缓存。
在这里插入图片描述

6.删除构建目录额外的文件
在构建镜像时将会上传构建文件夹中的所有文件,但有时不是全部的文件都是构建所需的,可以通过.dockerignore文件进行过滤,这将提高构建的速度及镜像的大小。

7.优化网络请求
在构建镜像过程中,可能有指令需要使用网络去实现下载、安装等操作,由于网络的不确定性,可能会造成构建过程较久,而且构建的时间不一等问题,建议采用本地化引用网络资源来解决问题,例如Centos使用yum进行软件包的管理时,可以通过Nexus进行本地代理,从而减少网络请求的问题。

使用优化

8.使用CMD、VOLUME指令对Image进行服务化
在不同的业务场景中会对镜像有不同的应用,但如果每次需要进行手动添加一些业务特定的东西时是比较繁琐的,可以采用CMD、VOLUME指令进行镜像的服务化弹性定制。

9.使用LABEL对镜像进行元数据维护
在Docker镜像仓库中可能托管很多镜像,每一个镜像通途不一,但靠镜像名和标记是无法判断具体信息的,使用LABEL的方式可以对镜像的元数据进行管理,从而更清晰的知道镜像的信息。

10.使用变量
就像编程一样,当一个字符串出现多次时,请用ARG来声明变量取代hard code。

文章来源: yekangming.blog.csdn.net,作者:叶康铭,版权归原作者所有,如需转载,请联系作者。

原文链接:yekangming.blog.csdn.net/article/details/103950556

(完)