針對於DockerFile文件中的編寫問題,裁剪縮小式編寫層數(減少鏡像層)

學習來源,源自阿良的Devops技術棧。微信號:k8sstack
事實上,絕大多數時候,根據當前需求,或者說業務需求,官方倉庫的數以萬計的鏡像,都無法完全滿足我們的需求,那麼我們就可以自己去定製化我們的鏡像,

Docker通過Dockerfile自動構建鏡像,Dockerfile是一個包含用於組建鏡像的文本文件,由一條一條的指令組成。
https://blog.csdn.net/qq_28513801/article/details/90180708這是dockerFile的使用操作。

1.首先第一點:
1. 減少鏡像層
一次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層鏡像層。

2.優化鏡像大小:清理無用數據

一次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*

這樣,每次形成新的一層的無用數據,都及時被清除,這樣至少能節省幾十兆,甚至更大的空間。

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 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參數,用於拷貝某個階段的文件到當前階段。
這樣的話,一個Docekrfile就都可以完成了。

總結:

鏡像小有很多好處,例如快速部署、快速回滾。減少服務中斷時間,同時鏡像倉庫佔用磁盤空間也少了。

發佈了158 篇原創文章 · 獲贊 293 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章