前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >优化Docker镜像大小方案

优化Docker镜像大小方案

作者头像
拓荒者
发布2019-03-11 11:09:01
2.8K0
发布2019-03-11 11:09:01
举报
文章被收录于专栏:运维经验分享

       我们如果使用Dockerfile来构建Docker镜像,如果一不小心就会导致镜像大小超过1G,这是非常恐怖的。一般也都是好几百兆。较大的镜像往往会导致移植,迁移缓慢。Dockerfile就像代码一样需要持续去进行优化。使用下面的4个优化方案,可以大幅度的减小镜像的大小。

  • 最重要的因素是减少镜像的层数,这样能大大减小镜像的大小;

使用链式代码“&&”把多行指令结合成一行。

该方式创建的镜像大小为:837.6M

FROM centos:6.7

MAINTAINER chenyufeng "yufengcode@gmail.com"

# 设置当前工具目录

# 该命令不会新增镜像层

WORKDIR /home

# 安装必要的工具

RUN yum install -y wget && rpm --rebuilddb && yum install -y tar

# 从jdk官网下载压缩包

RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && tar -xvzf jdk-8u131-linux-x64.tar.gz

# 从tomcat官网下载压缩包

RUN wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz && tar -xvzf apache-tomcat-8.0.47.tar.gz && mv apache-tomcat-8.0.47/ tomcat

# 设置环境变量

ENV JAVA_HOME /home/jdk1.8.0_131

ENV CATALINA_HOME /home/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露tomcat 8080端口

EXPOSE 8080

ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out

# 创建容器启动tomcat

CMD ["/home/tomcat/bin/startup.sh","run"]

其实在不影响阅读的情况下,可以只写成一行RUN代码,用“&&”,“\”进行连接。但是构建过程会比多个RUN时更慢。

该方式创建的镜像大小为:837.6M【结果还是一样的】

FROM centos:6.7

MAINTAINER chenyufeng "yufengcode@gmail.com"

# 设置当前工具目录

# 该命令不会新增镜像层

WORKDIR /home

# 安装必要的工具

RUN yum install -y wget && \

    rpm --rebuilddb && \

    yum install -y tar && \

    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \

    tar -xvzf jdk-8u131-linux-x64.tar.gz && \

    wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz && \

    tar -xvzf apache-tomcat-8.0.47.tar.gz && \

    mv apache-tomcat-8.0.47/ tomcat

# 设置环境变量

ENV JAVA_HOME /home/jdk1.8.0_131

ENV CATALINA_HOME /home/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露tomcat 8080端口

EXPOSE 8080

ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out

# 创建容器启动tomcat

CMD ["/home/tomcat/bin/startup.sh","run"]

可以根据实际的需求和测试结果,选择需要几个RUN。

  • 清除yum缓存

在Dockerfile中我们可能会使用yum命令下载一些东西,但是会有yum会把下载的软件包和header存储在缓存中,而不会自动删除。

在每一层都可以执行该步骤,也就是每一层都可以去清除yum缓存,而不是说一个Dockerfile文件只要一个yun clean all即可,应该是一个镜像层需要一个yun clean all。

# 清除header

yum clean headers

# 清除下载的rpm包

yum clean packages

# 全部清除

yun clean all

优化的Dockerfile,构建出来的镜像大小为788.1M:

FROM centos:6.7

MAINTAINER chenyufeng "yufengcode@gmail.com"

# 设置当前工具目录

# 该命令不会新增镜像层

WORKDIR /home

# 安装必要的工具

RUN yum install -y wget && \

    rpm --rebuilddb && \

    yum install -y tar && \

    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \

    tar -xvzf jdk-8u131-linux-x64.tar.gz && \

    wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz && \

    tar -xvzf apache-tomcat-8.0.47.tar.gz && \

    mv apache-tomcat-8.0.47/ tomcat && \

    yum clean all

# 设置环境变量

ENV JAVA_HOME /home/jdk1.8.0_131

ENV CATALINA_HOME /home/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露tomcat 8080端口

EXPOSE 8080

ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out

# 创建容器启动tomcat

CMD ["/home/tomcat/bin/startup.sh","run"]

  • 清除无用的tar.gz安装包

在Dockerfile中可能会使用类似wget等命令下载多个tar.gz  , tar包,在使用完成后应该把它们删除。同时最好结合”yum clean all”一起使用。

此时构建的镜像大小为 593.2M   。瘦身效果非常明显。

FROM centos:6.7

MAINTAINER chenyufeng "yufengcode@gmail.com"

# 设置当前工具目录

# 该命令不会新增镜像层

WORKDIR /home

# 安装必要的工具

RUN yum install -y wget && \

    rpm --rebuilddb && \

    yum install -y tar && \

    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \

    tar -xvzf jdk-8u131-linux-x64.tar.gz && \

    wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz && \

    tar -xvzf apache-tomcat-8.0.47.tar.gz && \

    mv apache-tomcat-8.0.47/ tomcat && \

    rm -f jdk-8u131-linux-x64.tar.gz && \

    rm -f apache-tomcat-8.0.47.tar.gz && \

    yum clean all

# 设置环境变量

ENV JAVA_HOME /home/jdk1.8.0_131

ENV CATALINA_HOME /home/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露tomcat 8080端口

EXPOSE 8080

ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out

# 创建容器启动tomcat

CMD ["/home/tomcat/bin/startup.sh","run"]

  • 选择更小的基础镜像

从源头减小自定义镜像的大小。

这里以ubuntu16.04来对比上面的centos6.7,

下面构建出的镜像为:558.6M。 比centos的基础镜像减小不少。

FROM ubuntu:16.04

MAINTAINER chenyufeng "yufengcode@gmail.com"

# 设置当前工具目录

# 该命令不会新增镜像层

WORKDIR /home

# 安装必要的工具

RUN apt-get update

RUN apt-get install wget --assume-yes

#RUN rpm --rebuilddb

RUN apt-get install tar --assume-yes

RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \

    tar -xvzf jdk-8u131-linux-x64.tar.gz && \

    wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz && \

    tar -xvzf apache-tomcat-8.0.47.tar.gz && \

    mv apache-tomcat-8.0.47/ tomcat && \

    rm -f jdk-8u131-linux-x64.tar.gz && \

    rm -f apache-tomcat-8.0.47.tar.gz

# 设置环境变量

ENV JAVA_HOME /home/jdk1.8.0_131

ENV CATALINA_HOME /home/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露tomcat 8080端口

EXPOSE 8080

ENTRYPOINT /home/tomcat/bin/startup.sh && tail -f /home/tomcat/logs/catalina.out

# 创建容器启动tomcat

CMD ["/home/tomcat/bin/startup.sh","run"]

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档