必看的dockerfile禁忌與建議!


腳本后續更新及迭代將由kkitDeploy項目代替
https://github.com/luckman666/kkitdeploy_server
請大家持續關注kkitDeploy

 

直接上對照組(看第三個run)

test1

1 FROM centos
2 MAINTAINER **
3 4 RUN yum -y update
5 RUN yum -y install wget
6 7 RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz" -O /tmp/jdk8_x64.tar.gz && gunzip /tmp/jdk8_x64.tar.gz && tar -C /opt -xf /tmp/jdk8_x64.tar && ln -s /opt/jdk1.8.0_121 /opt/jdk && yum clean all && rm -fr /tmp/*

test2

1 FROM centos
2 MAINTAINER **
3 4 RUN yum -y update
5 RUN yum -y install wget
6 7 RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz" -O /tmp/jdk8_x64.tar.gz && gunzip /tmp/jdk8_x64.tar.gz && tar -C /opt -xf /tmp/jdk8_x64.tar && ln -s /opt/jdk1.8.0_121 /opt/jdk 
8 RUN yum clean all 
9 RUN rm -fr /tmp/*

一樣的命令我們分開不同來寫會有什么區別呢?

1 alex@ubuntu:~/workspace/docker_project$ docker images
2 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
3 test2               latest              a65c6cced43b        13 minutes ago      1.1 GB
4 test1               latest              67897397b053        14 minutes ago      729 MB

看到區別了么?

禁忌一(不分層或者瞎分層):

同一業務或功能操作分在一個層(一個run就是一個層哦!)!

禁忌二(切記畫蛇添足):

絕對也千萬別運行yum update,docker的目的就是用最小的資源運行程序。所以一律做減法,沒用的不做,可用不可不用的不做,切記畫蛇添足!

禁忌三(鏡像好不好,就看小不小!):

別用docker commit制作鏡像,這樣的鏡像都是沒根的鏡像,今天你知道咋回事。明天你可能就忘了,不好追溯其結構和順序!而且這樣的鏡像通常都非常大!

禁忌四(容器的記憶比金魚還短):

不要在docker中寫入數據,如果有數據產生,必須存儲在volume中

禁忌五(一個容器一個進程):

不多說了奧,容器不是虛擬機,一個容器干一個活就OK拉!

禁忌六(只安裝,不刪除):

用完的包要立即刪除。

推薦及建議:

一、使用Alpine

Alpine是一個高度精簡又包含了基本工具的輕量級Linux發行版,基礎鏡像只有4.41M,各開發語言和框架都有基於Alpine制作的基礎鏡像,所以推薦使用Alpine做基礎鏡像

看到他們差多少了嗎?

二、使用scratch鏡像構建其他鏡像:

scratch是一個空鏡像,只能用於構建其他鏡像,比如你要運行一個包含所有依賴的二進制文件,如Golang程序,可以直接使用scratch作為基礎鏡像。還記得我們k8s里面的 pause鏡像嘛?來看看它的Dockerfile:
FROM scratch
ARG ARCH
ADD bin/pause-${ARCH} /pause
ENTRYPOINT ["/pause"]
pause鏡像使用了scratch作為基礎鏡像,這個鏡像本身是不占空間的,使用它構建的鏡像大小幾乎和二進制文件本身一樣大,所以鏡像非常小。當然在我們的Golang程序中也會使用。對於一些Golang/C程序,可能會依賴一些動態庫,你可以使用自動提取動態庫工具,比如ldd、linuxdeployqt等提取所有動態庫,然后將二進制文件和依賴動態庫一起打包到鏡像中。

三、 busybox鏡像(安卓核心哦!)

scratch是個空鏡像,如果希望鏡像里可以包含一些常用的Linux工具,busybox鏡像是個不錯選擇,鏡像本身只有1.16M,非常便於構建小鏡像。

四、其他優化:

(1)在執行apt-get install -y 時增加選項— no-install-recommends ,可以不用安裝建議性(非必須)的依賴,也可以在執行apk add 時添加選項--no-cache 達到同樣效果;

(2)執行yum install -y 時候, 可以同時安裝多個工具,比如yum install -y gcc gcc-c++ make …。將所有yum install 任務放在一條RUN命令上執行,從而減少鏡像層的數量;

(3)組件的安裝和清理要串聯在一條指令里面,如 apk --update add php7 && rm -rf /var/cache/apk/* ,因為Dockerfile的每條指令都會產生一個文件層,如果將apk add … 和 rm -rf … 命令分開,清理無法減小apk命令產生的文件層的大小。 Ubuntu或Debian可以使用 rm -rf /var/lib/apt/lists/* 清理鏡像中緩存文件;CentOS等系統使用yum clean all 命令清理。

歡迎關注我的個人公眾號,有更多的學習資料等您來拿。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM