高效編寫Dockerfile的幾條準則

2021-08-21 09:26:17 字數 3339 閱讀 1264

然而寫 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 基於...