前言
有一套好的编写规范可以使得协作者,更加清晰的了解镜像的完整构建流程,还可以减少镜像的体积,加快镜像构建的速度和分发速度。
单一职责
由于容器的本质是进程,一个容器代表一个进程,因此不同功能的应用应该尽量拆分为不同的容器,每个容器只负责单一业务进程。
提供注释信息
Dockerfile 也是一种代码,我们应该保持良好的代码编写习惯,晦涩难懂的代码尽量添加注释,让协作者可以一目了然地知道每一行代码的作用,并且方便扩展和使用。
保持容器最小化
应该避免安装无用的软件包,比如在一个nginx镜像中,我并不需要安装vim、gcc等开发编译工具,这样不仅可以加快容器构建速度,而且可以避免镜像体积过大。
合理选择基础镜像
容器的核心是应用,因此只要基础镜像能够满足应用的运行环境即可,例如一个php项目,运行时可能只需要php-fpm,并不需要php-cli,因此我们只需要安装php-fpm就行了。
尽量使用构建缓存
Docker 构建过程中,每一条Dockerfile 指令都会提交为一个镜像层,下一条指令都是基于上一条指令构建的。如果构建时发现要构建的镜像层的父镜像层已经存在,并且下一条命令使用了相同的指令,就可命中构建缓存。
基于Docker构建时的缓存特性,我们需要将不轻易改变的指令放到Dockerfile前面(例如安装包),而可能经常发生变化的指令则放在Dockerfile末尾 例如(编译应用程序)
FROM php:7.4
# 设置环境变量指令放前面
ENV TZ=Asia/Shanghai
# 安装软件指令放前面
RUN pecl install redis
# 把业务软件的配置,版本经常变动的步骤放最后
按照上面原则编写的Dockerfile在构建镜像时,前面步骤命中缓存的概率会增加,可以加快构建速度。
正确设置时区
从docker-hub上拉取的官方镜像大多数都是 UTC时间,而我们在使用时需要将时区改为 中国区标准时间(东八区)。
# Ubuntu 和 Debian 系统
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shangehai" >> /etc/timezone
# centos
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
使用国内软件源加快镜像构建速度
由于很多镜像都是国外的,软件服务器也大部分在国外,所以我们构建镜像的时候想要安装一些软件包可能非常慢,这个时候我们就应该换成 国内的镜像源了:例如 阿里,华为 等
国内源地址
最小化镜像层数
在构建镜像时,尽可能的减少Dockerfile指令行数。因为每行都相当于一层镜像。
RUN pecl install mongodb \
&& pecl install redis
# 而不应该写成这样:
RUN pecl install mongodb
RUN pecl install redis