码头工人镜像构建的优化总结

  

码头工人镜像构建的优化总结

  
 <代码>随着我们对码头工人镜像的持续使用,在此过程中如果不加以注意并且优化,镜像的体积会越来越多。很多时候我们在使用码头工人部署应用时,会发现镜像的体积至少有1 g以上。镜像体积的增大,不单单会增加磁盘资源与网络资源的开销,也会影响应用的部署效率,使得应用的部署时间会越来越长,因此我们需要减少部署镜像的体积以加快部署效率,降低资源的开销。而对于镜像的优化,可以通过对dockerfile的优化来实现。 
  

一、镜像最小化

  

1,选择最精简的基础镜像

  
 <代码>选择体积最小的基础镜像可有效降低镜像体积。如:高山,busybox等 
  

2,清理镜像构建的中间产物。

  
 <代码>构建镜像的过程中,当dockerfile的指令执行完成后,删除镜像不需要用的的文件。如使用yum安装组件,最后可使用yum清洁所有镜像清理不需要的文件或者使用系统rm命令删除不需要的源文件等。 
  

3,减少镜像的层数

  
 <代码>镜像是一个分层存储的文件,并且镜像对层数也是有一定数量的限制,当前镜像的层数最高是127层,如果不多加注意,将会导致镜像越来越臃肿。在使用dockerfile构建镜像时,dockerfile中的每一条指令都会生成一个层,因此可以通过合并dockerfile中可合并的指令,减少最终生成镜像的层数,例如:在dockerfile中使用运行执行shell命令是,可以用“,和”将多条命令连接起来。 
  

二、构建速度最快化

  

1,充分利用镜像构建缓存

  
 <代码>我们可以利用构建的缓存来加快镜像构建速度,码头工人构建默认会开启缓存,缓存生效有三个关键点,镜像父层没有发生变化,构建指令不变,添加文件校验和一致。只要一个构建指令满足这三个条件,这一层镜像构建就不会再执行,它会直接利用之前构建的结果。某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。我们应该把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存.dockerfile中有可能导致缓存失效的命令WORKDIR, CMD, ENV,添加等,像这些命令最好放到Dockerfile底部,以便在构建镜像过程中最大限度使用缓存。 
  

2,删除构建目录中(默认:Dockerfile所在目录)不需要用的的文件。

  
 <代码>编写.dockerignore文件过滤构建过程中不必要的文件或者创建单独的目录,并且目录中仅存在镜像构建过程中需要使用的文件。
  码头工人在运行时分为码头工人引擎(也就是服务端守护进程)和客户端工具.Docker的引擎提供了一组REST API,被称为码头工人远程API,而如码头工人命令这样的客户端工具,则是通过这组API与码头工人引擎交互,从而完成各种功能,因此,虽然表面上我们好像是在本机执行各种码头工人功能,但实际上,一切都是使用的远程调用形式在服务端(码头工人引擎)完成.Docker构建命令构建镜像,其实并非在本地构建,而是在服务端,也就是码头工人引擎中构建的。
  构建镜像时,码头工人需要先准备上下文,将所有需要的文件收集到进程中。默认的上下文包含Dockerfile目录中的所有文件。如果目录中的存在大量不相关的文件,不仅会导致构建缓慢,而且还会导致镜像体积增大。
  .dockerignore示例如下:
  在一个git项目中,我们并不需要.目录等内容。可以在.dockerignore文件中加入以下内容:
  ./.dockerignore的作用和语法类似于.gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少码头工人镜像的大小。 
  

3注意优化网络请求

  
 <代码>我们使用一些镜像源或者在dockerfile中使用互联网上的url时,去用一些网络比较好的开源站点,这样可以节约时间,减少失败率 
  

三,dockerfile指令优化

  

1,复制指令和添加指令的区别

  
 <代码>复制复制文件
  格式:
  复制& lt;源路径在…& lt;目标路径比;
  复制(“& lt;源路径1祝辞”,…“& lt;目标路径祝辞”)
  复制指令将从构建上下文目录中& lt;源路径比;的文件/目录复制到新的一层的镜像内的& lt;目标路径比;位置比。如:
  复制方案。json/usr/src/app/& lt;源路径比;可以是多个,甚至可以是通配符,其通配符规则要满足去的filepath。比赛规则,如:
  hom */mydir/副本
  复制hom ?。txt/mydir/& lt;目标路径比;可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
  此外,还需要注意一点,使用复制指令,源文件的各种元数据都会保留。比如读、写,执行权限,文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用Git进行管理的时候。
  
  添加更高级的复制文件
  
  添加指令和复制的格式和性质基本一致。但是在复制基础上增加了一些功能。
  
  比如& lt;源路径比;可以是一个URL,这种情况下,码头工人引擎会试图去下载这个链接的文件放到& lt;目标路径比;去。下载后的文件权限自动设置为600,如果这并不是想要的权限,那么还需要增加额外的一层跑进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层运行指令进行解压缩。所以不如直接使用运行指令,然后使用wget或者curl工具下载,处理权限,解压缩,然后清理无用文件更合理,因此,这个功能其实并不实用,而且不推荐使用。
  
  如果& lt;源路径比;为一个焦油压缩文件的话,压缩格式为gzip、bzip2以及xz的情况下,添加指令将会自动解压缩这个压缩文件到& lt;目标路径比;去。
  
  在某些情况下,这个自动解压缩的功能非常有用,比如官方镜像ubuntu中:
  
  从头开始
  添加ubuntu-xenial-core-cloudimg-amd64-root.tar。广州/?
  但在某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用添加命令了。
  
  在码头工人官方的最佳实践文档中要求,尽可能的使用复制,因为复制的语义很明确,就是复制文件而已,而添加则包含了更复杂的功能,其行为也不一定很清晰。最适合使用添加的场合,就是所提及的需要自动解压缩的场合。
  
  另外需要注意的是,添加指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
  
  因此在副本和添加指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用复制指令,仅在需要自动解压缩的场合使用添加。

码头工人镜像构建的优化总结