溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

編寫 Dockerfile 最佳實(shí)踐

發(fā)布時(shí)間:2020-07-09 05:19:09 來(lái)源:網(wǎng)絡(luò) 閱讀:5911 作者:李振良OK 欄目:云計(jì)算

官方倉(cāng)庫(kù)雖然有數(shù)十萬(wàn)計(jì)的免費(fèi)鏡像,但大多數(shù)無(wú)法直接滿足公司業(yè)務(wù)需求,這就需要我們自己去定制鏡像了。

Docker通過(guò)Dockerfile自動(dòng)構(gòu)建鏡像,Dockerfile是一個(gè)包含用于組建鏡像的文本文件,由一條一條的指令組成。

這里,給你提供4點(diǎn)編寫建議,可幫助你編寫高效易用的Dockerfile。

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"]

應(yīng)該寫成:

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"]

結(jié)果:12層 -> 6層

2. 優(yōu)化鏡像大小:清理無(wú)用數(shù)據(jù)

一次RUN形成新的一層,如果沒(méi)有在同一層刪除,無(wú)論文件是否最后刪除,都會(huì)帶到下一層,所以要在每一層清理對(duì)應(yīng)的殘留數(shù)據(jù),減小鏡像大小。

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*

至少能節(jié)省幾十M,甚至幾百M(fèi)。

3. 減少網(wǎng)絡(luò)傳輸時(shí)間

最好在內(nèi)部有一個(gè)存放軟件包的地方,類似于上述的PHP官方下載地址:http://docs.php.net/distributions/php-5.6.36.tar.gz ,如果用到maven構(gòu)建這樣的操作,同時(shí)也更改為私有maven倉(cāng)庫(kù),減少網(wǎng)絡(luò)傳輸時(shí)間,提高鏡像構(gòu)建速度。

4. 多階段進(jìn)行鏡像構(gòu)建

如果運(yùn)行一個(gè)項(xiàng)目,根據(jù)咱們上面的做法,是直接把代碼拷貝到基礎(chǔ)鏡像里,如果是一個(gè)需要預(yù)先代碼編譯的項(xiàng)目呢?例如JAVA語(yǔ)言,如何代碼編譯、部署在一起完成呢!

上面做法需要事先在一個(gè)Dockerfile構(gòu)建一個(gè)基礎(chǔ)鏡像,包括項(xiàng)目運(yùn)行時(shí)環(huán)境及依賴庫(kù),再寫一個(gè)Dockerfile將項(xiàng)目拷貝到運(yùn)行環(huán)境中,有點(diǎn)略顯復(fù)雜了。

像JAVA這類語(yǔ)言如果代碼編譯是在Dockerfile里操作,還需要把源代碼構(gòu)建進(jìn)去,但實(shí)際運(yùn)行時(shí)只需要構(gòu)建出的包,這種把源代碼放進(jìn)去有一定安全風(fēng)險(xiǎn),并且也增加了鏡像體積。
為了解決上述問(wèn)題,Docker 17.05開始支持多階段構(gòu)建(multi-stage builds),可以簡(jiǎn)化Dockerfile,減少鏡像大小。

例如,構(gòu)建JAVA項(xiàng)目鏡像:

# 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

首先,第一個(gè)FROM 后邊多了個(gè) AS 關(guān)鍵字,可以給這個(gè)階段起個(gè)名字。
然后,第二部分FROM用的我們上面構(gòu)建的Tomcat鏡像,COPY關(guān)鍵字增加了—from參數(shù),用于拷貝某個(gè)階段的文件到當(dāng)前階段。這樣一個(gè)Dockerfile就都搞定了。

小結(jié):鏡像小有很多好處,例如快速部署、快速回滾。減少服務(wù)中斷時(shí)間,同時(shí)鏡像倉(cāng)庫(kù)占用磁盤空間也少了。

編寫 Dockerfile 最佳實(shí)踐

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI