Docker之9 Dockerfile优化

为什么要进行Dockerfile的优化?

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

如何进行优化Dockerfile

镜像体积最小化

-1. 基础镜像的选择:
常用的 Linux 系统镜像一般有 ubuntu、centos、debian,其中debian 更轻量,而且适用的用途很广。在运行某种应用例如PHP时,在业务需要满足下尽量适用官方的Docker镜像。
Docker之9 Dockerfile优化

-2. 减少镜像层数:
在一个Dockerfile中每个命令都会在原来的基础上生成一层镜像,这毫无疑问将会对镜像增加体积,尽量将RUN命令进行组合,这将有效的减少镜像层数达到减少体积的效果。

#优化前
RUN wget jdk-8u191-linux-x64.tar.gz
RUN tar zxvf jdk-8u191-linux-x64.tar.gz
#优化后
RUN tar zxvf jdk-8u191-linux-x64.tar.gz && \
 mv jdk1.8.0_191 /usr/local/jdk

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

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

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

构建速度最快化

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

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

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

使用优化

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

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

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

上一篇:三分钟浅谈TT猫的前端优化


下一篇:Linux恶意软件正在部署物联网设备僵尸网络