1、基础镜像
构建镜像使用的基础镜像,推荐使用官方的一些基础镜像,同时也可以自己在官方基础镜像上添加一些时区配置,软件源配置,安装一些常用的工具等。
2、容器进程
docker容器虽然支持多个进程的运行,但是只监听主进程的存活,建议不要在一个容器中启动多个进程。
docker容器启动后,会监听启动的主进程,如果主进程后台运行,docker会认为主进程已退出,导致容器运行出错。请保证主进程前台运行。如果需要在宿主机上后台运行容器,请使用-d参数。k8s会自动让容器后台运行。
如使用nohup命令启动的进程,容器会在启动时直接退出,导致容器不断重启。比如redis容器中,配置文件的daemonize为yes,导致redis进程后台启动,容器不断重启。
3、镜像层
docker镜像由多个镜像层组成,每一层都有它独立的id和校验和。docker会复用相同校验和的镜像层,以此降低镜像大小,提高传输速度。
镜像构建过程中,Dockerfile的每一行指令对应创建一个镜像层,因此,请尽可能减少Dockerfile指令的使用。
镜像构建过程中,docker-engine会解析Dockerfile的指令,如果指令没用使用上下文的文件或上下文中的文件没有发生变更,就会复用使用上次构建的镜像对应的镜像层,提高构建速度。但是,如果出现变更,会重新构建镜像层,而且后面的镜像层也会重新构建(不管有没有变化),因此,请把变更概率少的指令放到前面,变更多的指令放在后面,提高构建速度。
如果不希望复用上次构建的镜像层,可以使用--no-cache参数。
4、参数化配置
docker镜像的区别应该体现在功能上,而不是配置上。因此,构建镜像前,应该对应用改造,提取其中的配置,可以使用配置中心,环境变量注入,配置文件挂在等方式,在不同配置下使用同一个镜像。常用的配置提取应该包含
1. 第三方服务的地址,端口,协议,授权等信息
2. 应用暴露功能的范围
3. 功能阈值,如熔断,超时时间等
5、用户
docker默认使用受限的root权限启动容器,为了安全,请使用非root用户启动,可以在Dockerfile中定义启动进程的用户。构建镜像过程中仍然是root用户,请注意修改添加到容器中的文件权限和拥有者。
6、过程容器
在构建运行时容器前,除了使用jenkins编译源代码,还可以使用过程容器编译,然后使用过程容器的制品构建运行时容器。这样做的好处是,不依赖jenkins编译环境,新项目特别是对编译环境有较高依赖要求如C等项目,无需在jenkins机器配置复杂的编译环境,就可以轻松构建,而且可以几乎不需要修改配置地迁移到任意构建环境。
7、禁止使用的命令
某些命令与云主机置配置冲突,如果使用了,将会导致不可预见到错误,请不要使用他们:
1. link:禁止在Dockerfile,程序,启动脚本中使用link命令创建文件链接。
2. VOLUME:禁止在Dockerfile中使用VOLUME指令创建目录映射。