编写Dockerfile最佳实践

  

官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了。

  

码头工人通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。

  

这里,给你提供4点编写建议,可帮助你编写高效易用的Dockerfile。

  

1。减少镜像层

  

一次运行指令形成新的一层,尽量壳命令都写在一行,减少镜像层。
例如:

  从centos
 <代码>:7
  维护者www.ctnrs.com
  运行yum安装epel-release - y
  运行yum安装- y gcc gcc-c + + - y
  wget运行http://docs.php.net/distributions/php-5.6.36.tar.gz
  运行tar zxf php-5.6.36.tar.gz
  运行cd php-5.6.36
  运行./configure——prefix=/usr/地方/php
  运行make - j 4
  运行make install
  9000年公开
  CMD (“php-fpm”)  
  

应该写成:

  从centos
 <代码>:7
  维护者www.ctnrs.com
  运行yum安装epel-release - y,和\
  yum安装- y gcc gcc-c + +
  
  wget运行http://docs.php.net/distributions/php-5.6.36.tar.gz,,\
  焦油zxf php-5.6.36.tar。广州,,\
  cd php-5.6.36,,\
  ./configure——prefix=/usr/地方/php,,\
  让- j 4,,制作安装
  9000年公开
  CMD (“php-fpm”)  
  

结果:12层→6层

  

2。优化镜像大小:清理无用数据

  

一次运行形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。

  从centos
 <代码>:7
  维护者www.ctnrs.com
  运行yum安装epel-release - y,和\
  yum安装- y gcc gcc-c + +使gd-devel libxml2-devel \
  libcurl-devel libjpeg-devel libpng-devel openssl-devel \
  libmcrypt-devel libxslt-devel libtidy-devel autoconf \
  iproute net-tools telnet wget卷曲,,\
  百胜清洗所有的,,\
  rm射频/var/cache/yum/*
  
  wget运行http://docs.php.net/distributions/php-5.6.36.tar.gz,,\
  焦油zxf php-5.6.36.tar。广州,,\
  cd php-5.6.36,,\
  ./configure——prefix=/usr/地方/php \
  让- j 4,,制作安装,,\
  cd/,,rm射频php *  
  

至少能节省几十米,甚至几百M .

  
3。减少网络传输时间h5> 最好在内部有一个存放软件包的地方,类似于上述的PHP官方下载地址:http://docs.php.net/distributions/php-5.6.36.tar.gz,如果用到maven构建这样的操作,同时也更改为私有maven仓库,减少网络传输时间,提高镜像构建速度。

  
4。多阶段进行镜像构建h5> 如果运行一个项目,根据咱们上面的做法,是直接把代码拷贝到基础镜像里,如果是一个需要预先代码编译的项目呢?例如JAVA语言,如何代码编译,部署在一起完成呢!

  

上面做法需要事先在一个Dockerfile构建一个基础镜像,包括项目运行时环境及依赖库,再写一个Dockerfile将项目拷贝到运行环境中,有点略显复杂了。

  

像JAVA这类语言如果代码编译是在Dockerfile里操作,还需要把源代码构建进去,但实际运行时只需要构建出的包,这种把源代码放进去有一定安全风险,并且也增加了镜像体积。
为了解决上述问题,码头工人17.05开始支持多阶段构建(多级构建),可以简化Dockerfile,减少镜像大小。

  

例如,构建JAVA项目镜像:

  
 <代码> # git克隆https://github.com/lizhenliang/tomcat-java-demo
  # cd tomcat-java-demo
  # vi Dockerfile
  从maven构建
  添加。/pom。xml pom.xml
  添加/src src/运行mvn清洁包
  
  从lizhenliang/tomcat
  运行rm射频/usr/local/tomcat/webapps/ROOT
  复制——从=构建目标/*。战争/usr/local/tomcat/webapps/ROOT.war
  
  #码头工人建造- t演示:v1。
  #码头工人容器运行- d - v演示:v1  
  第

首先,一个从后边多了个像关键字,可以给这个阶段起个名字。
然后,第二部分从用的我们上面构建的Tomcat镜像,复制关键字增加了从参数,用于拷贝某个阶段的文件到当前阶段。这样一个Dockerfile就都搞定了。

  
  

小结:镜像小有很多好处,例如快速部署,快速回滚。减少服务中断时间,同时镜像仓库占用磁盘空间也少了。

     

编写Dockerfile最佳实践“> </p><h2 class=编写Dockerfile最佳实践