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

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就都搞定了。

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

-END -

©著作权归作者所有:来自51CTO博客作者mob604756e5abbc的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 编写Dockerfile最佳实践
  2. 构建用户评分体系
  3. 三分钟构建自动化运维平台-nightingale(夜莺)
  4. [灾备]通过 NAS 与文件服务器结合构建数据容灾系统
  5. 保护隐私减少广?告骚扰小技巧-微*信篇
  6. aws 部署方案
  7. 运维人员如何构建知识体系
  8. 使用 Docker 和 Nginx 打造高性能二维码服务(二)
  9. 从封装 Nginx NJS 工具镜像聊起

随机推荐

  1. 显示或不显示。
  2. 使用JavaScript显示HTML文本框中剩余的字
  3. ArcGIS API For JavaScript 实现鼠标移入
  4. 角度连接2控制器通过1服务与ES6语法
  5. JavaScript数组中的唯一计数,按计数排序
  6. 如何访问远程节点。浏览器中的js应用程序
  7. 为什么jquery click事件在plunker中工作
  8. Gulp.js事件流合并顺序
  9. 优雅的JavaScript-BOM详解
  10. 单击它时,为什么下拉菜单不在我的导航栏中