编写 Dockerfile 最佳实践

发布时间:2024-09-02 点击:63
云计算
官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了。
docker通过dockerfile自动构建镜像,dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。
这里,给你提供4点编写建议,可帮助你编写高效易用的dockerfile。
1. 减少镜像层
一次run指令形成新的一层,尽量shell命令都写在一行,减少镜像层。
例如:
from centos:7maintainer www.ctnrs.comrun yum install epel-release -y run yum install -y gcc gcc-c make -yrun wget http://docs.php.net/distributions/php-5.6.36.tar.gzrun tar zxf php-5.6.36.tar.gzrun cd php-5.6.36run ./configure --prefix=/usr/local/php run make -j 4 run make installexpose 9000cmd [php-fpm]应该写成:
from centos:7maintainer www.ctnrs.comrun yum install epel-release -y && \\\\ yum install -y gcc gcc-c makerun 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/local/php && \\\\ make -j 4 && make installexpose 9000cmd [php-fpm]结果:12层 -> 6层
2. 优化镜像大小:清理无用数据
一次run形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。
from centos:7maintainer www.ctnrs.comrun yum install epel-release -y && \\\\ yum install -y gcc gcc-c make gd-devel libxml2-devel \\\\ libcurl-devel libjpeg-devel libpng-devel openssl-devel \\\\ libmcrypt-devel libxslt-devel libtidy-devel autoconf \\\\ iproute net-tools telnet wget curl && \\\\ yum clean all && \\\\ rm -rf /var/cache/yum/*run 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/local/php \\\\ make -j 4 && make install && \\\\ cd / && rm -rf php*至少能节省几十m,甚至几百m。
3. 减少网络传输时间
最好在内部有一个存放软件包的地方,类似于上述的php官方下载地址:http://docs.php.net/distributions/php-5.6.36.tar.gz ,如果用到maven构建这样的操作,同时也更改为私有maven仓库,减少网络传输时间,提高镜像构建速度。
4. 多阶段进行镜像构建
如果运行一个项目,根据咱们上面的做法,是直接把代码拷贝到基础镜像里,如果是一个需要预先代码编译的项目呢?例如java语言,如何代码编译、部署在一起完成呢!
上面做法需要事先在一个dockerfile构建一个基础镜像,包括项目运行时环境及依赖库,再写一个dockerfile将项目拷贝到运行环境中,有点略显复杂了。
像java这类语言如果代码编译是在dockerfile里操作,还需要把源代码构建进去,但实际运行时只需要构建出的包,这种把源代码放进去有一定安全风险,并且也增加了镜像体积。
为了解决上述问题,docker 17.05开始支持多阶段构建(multi-stage builds),可以简化dockerfile,减少镜像大小。
例如,构建java项目镜像:
# git clone https://github.com/lizhenliang/tomcat-java-demo# cd tomcat-java-demo# vi dockerfilefrom maven as buildadd ./pom.xml pom.xmladd ./src src/run mvn clean packagefrom lizhenliang/tomcatrun rm -rf /usr/local/tomcat/webapps/rootcopy --from=build target/*.war /usr/local/tomcat/webapps/root.war# docker build -t demo:v1 .# docker container run -d -v demo:v1首先,第一个from 后边多了个 as 关键字,可以给这个阶段起个名字。
然后,第二部分from用的我们上面构建的tomcat镜像,copy关键字增加了—from参数,用于拷贝某个阶段的文件到当前阶段。这样一个dockerfile就都搞定了。
小结:镜像小有很多好处,例如快速部署、快速回滚。减少服务中断时间,同时镜像仓库占用磁盘空间也少了。

关于高防服务问题-其他问题
买服务器哪家好
添加白名单打不开帮我看看我们问题
AWS,Azure还是Google?决定用于SAP实施的最佳云的六个步骤
什么是DNS,它有什么作用?
腾讯云新用户能买几台服务器
bootstrap3 是什么
轻量云服务器优惠券