2017年12月10日 17:54:46 閱讀數:1774 標籤: Docker 更多html
我的分類: Docker&Kubernetesjava
所屬專欄: Docker/Kubernetes技術分享linux
版權聲明:本文爲博主原創文章,歡迎分享到其它技術社區,分享請標明出處: https://blog.csdn.net/CHENYUFENG1991/article/details/78766123apache
咱們若是使用Dockerfile來構建Docker鏡像,若是一不當心就會致使鏡像大小超過1G,這是很是恐怖的。通常也都是好幾百兆。較大的鏡像每每會致使移植,遷移緩慢。Dockerfile就像代碼同樣須要持續去進行優化。使用下面的4個優化方案,能夠大幅度的減少鏡像的大小。ubuntu
使用鏈式代碼「&&」把多行指令結合成一行。centos
該方式建立的鏡像大小爲:837.6M緩存
FROM centos:6.7tomcat
MAINTAINER chenyufeng "yufengcode@gmail.com"cookie
# 設置當前工具目錄oracle
# 該命令不會新增鏡像層
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。
在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"]
在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"]