然而寫 dockerfile 也像寫**一樣,乙份精心設計、clean code 的 dockerfile 能在提高可讀性的同時也大大提公升docker的使用效率
因此下面就結合實踐來講幾條 dockerfile 的實踐心得!
在我的文章 《利用k8s技術棧打造個人私有雲(**之:基礎映象製作與實驗)》 中,我們是基於某個linux基礎映象作為底包,然後打包進我需要的功能從而形成自己的映象。
這裡選擇基礎映象時是有講究的:
-一是應當盡量選擇官方映象庫里的基礎映象;
-二是應當選擇輕量級的映象做底包
就典型的linux基礎映象來說,大小關係如下:
ubuntu > centos > debian
因此相比 ubuntu,其實更推薦使用最輕量級的 debian映象,而且它也是乙個完整的release版,可以放心使用
docker build -t=「centos:wordpress" .
例如上面的這個centos映象是用來做wordpress用的,所以已經整合了wordpress功能,這一看就很清晰明了
from debian:codesheep
什麼是映象快取?
由 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。此時的預設命令組成中:
- entrypoint 指令部分「一般」固定不變,容器執行時不修改
- 而 cmd 部分的指令也可以改變,表現在執行容器時,docker run
命令中提供的引數會覆蓋cmd的指令內容。
舉個例子:
from
debian
:latest
maintainer
codesheep
@163.com
entrypoint [ "ls", "-l"]
cmd ["-a"]
若以預設命令執行容器,可以發現,執行的是ls -a -l
命令:
若docker run
中增加引數-t
--rm --name test debian:codesheep -t
也可以發現執行的是ls -l -t
,即 dockerfile 中的 cmd 原引數被覆蓋了:
因此推薦的使用方式是:
dockerfile 可以通過 expose指令 將容器埠對映到主機埠上,但這樣會導致映象在一台主機上僅能啟動乙個容器!
所以應該在docker run
命令中來用-p
引數來指定埠對映,而不要將該工作置於 dockerfile 之中:
#盡量避免這種方式
expose 8080:8899
#僅僅暴露埠
expose 8080
如果有興趣,也可以抽點時間看看作者一些關於容器化、微服務化方面的文章:
可長按或掃瞄下面的小心心來訂閱codesheep,獲取更多務實、能看懂、可復現的原創文 ↓↓↓(十)DockerFile的編寫
dockerfile是用來構建docker映象的構建檔案,是由一系列命令和引數構成的指令碼。編寫dockerfile檔案 docker build docker run 下圖官方版docker版centos的dockerfile檔案 scrath是一切映象的根映象,cmd是會執行後面的命令 每條保留...
Dockerfile編寫記錄
dockerfile 近期幫朋友製作了docker映象以方便使用,在製作的過程中經歷了相容問題,映象size臃腫,映象內多服務問題,下面開始碼例項。from euleros workdir opt add opencv 4.1.0.tar.gz opt run rpm rpmbuilddb yum ...
Dockerfile編寫語法
docker映象本質上就是乙個個基礎映象的堆疊,為了做出我們想要的映象,我們需要考慮最終映象所需的所有基礎環境,然後一層層堆疊.也就是不斷以基礎映象搭建上層映象.先看例子 version 1.0.0 create time 2015 12 25 11 04 author description 基於...