腳本后續更新及迭代將由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 命令清理。
歡迎關注我的個人公眾號,有更多的學習資料等您來拿。