大佬教程收集整理的这篇文章主要介绍了编写 Dockerfile 最佳实践,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了。
Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。
这里,给你提供4点编写建议,可帮助你编写高效易用的Dockerfile。
一次RUN指令形成新的一层,尽量SHell命令都写在一行,减少镜像层。
例如:
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install epel-release -y
RUN yum install -y gcc gcc-c++ make -y
RUN wget http://docs.PHP.net/diStributions/PHP-5.6.36.tar.gz
RUN tar zxf PHP-5.6.36.tar.gz
RUN cd PHP-5.6.36
RUN ./configure --prefix=/usr/local/PHP
RUN make -j 4
RUN make install
EXPOSE 9000
CMD ["PHP-fpm"]
应该写成:
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make
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
EXPOSE 9000
CMD ["PHP-fpm"]
结果:12层 -> 6层
一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小。
FROM centos:7
MAINTAINER www.ctnrs.com
RUN 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。
最好在内部有一个存放软件包的地方,类似于上述的PHP官方下载地址:http://docs.php.net/distributions/php-5.6.36.tar.gz,如果用到maven构建这样的操作,同时也更改为私有maven仓库,减少网络传输时间,提高镜像构建速度。
如果运行一个项目,根据咱们上面的做法,是直接把代码拷贝到基础镜像里,如果是一个需要预先代码编译的项目呢?例如JAVA语言,如何代码编译、部署在一起完成呢!
上面做法需要事先在一个Dockerfile构建一个基础镜像,@L_616_37@项目运行时环境及依赖库,再写一个Dockerfile将项目拷贝到运行环境中,有点略显复杂了。
例如,构建JAVA项目镜像:
# git clone https://github.com/lizhenliang/tomcat-java-demo
# cd tomcat-java-demo
# vi Dockerfile
FROM maven AS build
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package
FROM lizhenliang/tomcat
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY --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就都搞定了。
小结:镜像小有很多好处,例如快速部署、快速回滚。减少服务中断时间,同时镜像仓库占用磁盘空间也少了。
-END -
以上是大佬教程为你收集整理的编写 Dockerfile 最佳实践全部内容,希望文章能够帮你解决编写 Dockerfile 最佳实践所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。