本文已得到原做者 CodeSheep 受權。docker
docker build
命令來自動化地從 Dockerfile 所描述的步驟來構建自定義的 Docker鏡像,這比咱們去命令行一條條指令執行的方式構建高效得多。然而寫 Dockerfile 也像寫代碼同樣,一份精心設計、Clean Code 的 Dockerfile 能在提升可讀性的同時也大大提高 Docker 的使用效率centos
所以下面就結合實踐來說幾條 Dockerfile 的實踐心得!緩存
在個人文章 《利用K8S技術棧打造我的私有云(連載之:基礎鏡像製做與實驗)》中,咱們是基於某個 Linux 基礎鏡像做爲底包,而後打包進我須要的功能從而造成本身的鏡像。運維
這裏選擇基礎鏡像時是有講究的:wordpress
就典型的 Linux 基礎鏡像來講,大小關係以下:工具
Ubuntu > CentOS > Debian
所以相比 Ubuntu,其實更推薦使用最輕量級的 Debian 鏡像,並且它也是一個完整的 Release 版,能夠放心使用post
docker build -t=「centos:wordpress" .
例如上面的這個 centos 鏡像是用來作 wordpress 用的,因此已經集成了 wordpress 功能,這一看就很清晰明瞭ui
FROM debian:codesheep
什麼是鏡像緩存?spa
由 Dockerfile 最終構建出來的鏡像是在基礎鏡像之上一層層疊加而得,所以在過程當中會產生一個個新的 鏡像層。Docker daemon 在構建鏡像的過程當中會緩存一系列中間鏡像。
docker build 鏡像時,會順序執行 Dockerfile 中的指令,並同時比較當前指令和其基礎鏡像的全部子鏡像,若發現有一個子鏡像也是由相同的指令生成,則 命中緩存,同時能夠直接使用該子鏡像而避免再去從新生成了。命令行
爲了有效地使用緩存,須要保證 Dockerfile 中指令的 連續一致,儘可能將相同指令的部分放在前面,而將有差別性的指令放在後面
舉例:假如我想用 Dockerfile 方式 基於最基本的 CentOS 鏡像來構建兩個不一樣的鏡像時,兩個 Dockerfile 的開頭能夠相同:
FROM centos:latest # 下面安裝兩個經常使用的工具 RUN yum install -y net-tools.x86_64 RUN yum install lrzsz ######## 上面爲兩個 Dockerfile 文件中相同的部分###### ######## 下面爲兩個 Dockerfile 文件中不一樣的部分###### ......
雖然二者均可以添加文件到鏡像中,但在通常用法中,仍是推薦以 COPY 指令爲首選,緣由在於 ADD 指令並無 COPY 指令來的純粹,ADD 會添加一些額外功能,典型的以下 ADD 一個壓縮包時,其不只會複製,還會自動解壓,而有時咱們並不須要這種額外的功能。
ADD codesheep.tar.gz /path
除此以外,在須要添加多個文件到鏡像中的時候,不要一次性集中添加,而是選擇 按需在必要時 逐個添加便可,由於這樣有利於利用鏡像緩存
雖然上面一條原則說推薦經過 COPY 命令來向鏡像中添加多個文件,然而實際狀況中,若文件 大而多的時候仍是應該優先用 docker -v
命令來掛載文件,而不是依賴於 ADD 或者 COPY
Dockerfile 製做鏡像時,會組合 CMD 和 ENTRYPOINT 指令來做爲容器運行時的默認命令:即 CMD + ENTRYPOINT。此時的默認命令組成中:
docker run
命令中提供的參數會覆蓋CMD的指令內容。舉個例子:
FROM debian:latest MAINTAINER codesheep@163.com ENTRYPOINT [ "ls", "-l"] CMD ["-a"]
若以默認命令運行容器,能夠發現,執行的是 ls -a -l
命令:
若 docker run
中增長參數 -t
docker run -it --rm --name test debian:codesheep -t
也能夠發現執行的是 ls -l -t
,即 Dockerfile 中的 CMD 原參數被覆蓋了:
所以推薦的使用方式是:
Dockerfile 能夠經過 EXPOSE 指令 將容器端口映射到主機端口上,但這樣會致使鏡像在一臺主機上僅能啓動一個容器!
因此應該在 docker run
命令中來用 -p
參數來指定端口映射,而不要將該工做置於 Dockerfile 之中:
#儘可能避免這種方式 EXPOSE 8080:8899 #選擇僅僅暴露端口便可,端口映射的任務交給 docker run 去作 EXPOSE 8080
推薦經過共享 Dockerfile 的方式來共享鏡像,優勢多多:
做者:CodeSheep
連接:https://juejin.im/post/5b4615b0f265...
來源:掘金
更多相關文章:
使用 Dockerfile 定製鏡像
用 Dockerfile 打造你的自動化構建工具
Docker 底層技術
若是你還想了解更多,想和技術同僚分享切磋,可掃下方二維碼,回覆 yw,加入掘金運維技術交流羣