例如:
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)化鏡像大?。呵謇頍o用數(shù)據(jù)
一次RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會帶到下一層,所以要在每一層清理對應(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ò)傳輸時間
最好在內(nèi)部有一個存放軟件包的地方,類似于上述的PHP官方下載地址:http://docs.php.net/distributions/php-5.6.36.tar.gz ,如果用到maven構(gòu)建這樣的操作,同時也更改為私有maven倉庫,減少網(wǎng)絡(luò)傳輸時間,提高鏡像構(gòu)建速度。
4. 多階段進(jìn)行鏡像構(gòu)建
如果運(yùn)行一個項(xiàng)目,根據(jù)咱們上面的做法,是直接把代碼拷貝到基礎(chǔ)鏡像里,如果是一個需要預(yù)先代碼編譯的項(xiàng)目呢?例如JAVA語言,如何代碼編譯、部署在一起完成呢!
上面做法需要事先在一個Dockerfile構(gòu)建一個基礎(chǔ)鏡像,包括項(xiàng)目運(yùn)行時環(huán)境及依賴庫,再寫一個Dockerfile將項(xiàng)目拷貝到運(yùn)行環(huán)境中,有點(diǎn)略顯復(fù)雜了。
像JAVA這類語言如果代碼編譯是在Dockerfile里操作,還需要把源代碼構(gòu)建進(jìn)去,但實(shí)際運(yùn)行時只需要構(gòu)建出的包,這種把源代碼放進(jìn)去有一定安全風(fēng)險,并且也增加了鏡像體積。
為了解決上述問題,Docker 17.05開始支持多階段構(gòu)建(multi-stage builds),可以簡化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
首先,第一個FROM 后邊多了個 AS 關(guān)鍵字,可以給這個階段起個名字。
然后,第二部分FROM用的我們上面構(gòu)建的Tomcat鏡像,COPY關(guān)鍵字增加了—from參數(shù),用于拷貝某個階段的文件到當(dāng)前階段。這樣一個Dockerfile就都搞定了。
小結(jié):鏡像小有很多好處,例如快速部署、快速回滾。減少服務(wù)中斷時間,同時鏡像倉庫占用磁盤空間也少了。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn