Docker 使用鏡像創(chuàng)建容器的過程:現(xiàn)在本機(jī)查找有無該鏡像恋捆,如果不存在妒峦,就去官方Docker Hub 倉庫查找并下載到本機(jī)杏节,然后基于該容器創(chuàng)建容器唯竹。
docker run --name gitlab-redis -d sameersbn/redis:latest
鏡像分層
Docker 鏡像采用分層機(jī)制乐导,相同部分獨(dú)立成層,所以浸颓,相同部分只需要存儲(chǔ)一份即可物臂,大大節(jié)省了鏡像空間。
Docker鏡像的兩個(gè)特性:
- 一個(gè)已有的分層只能讀不能修改
-
上層鏡像的優(yōu)先級(jí)高于底層鏡像
舉例:
通過修改讀寫層生成鏡像(通過容器的方式創(chuàng)建鏡像)存在的弊端:會(huì)導(dǎo)致鏡像的層數(shù)越來越多产上,允許的最大層數(shù)為128棵磷;底層鏡像修改,影響大量的上層鏡像晋涣。
Dockerfile
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本仪媒,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。它們簡化了從頭到尾的流程并極大的簡化了部署工作谢鹊。Dockerfile從FROM命令開始算吩,緊接著跟隨者各種方法,命令和參數(shù)佃扼。其產(chǎn)出為一個(gè)新的可以用于創(chuàng)建容器的鏡像偎巢。
在撰寫 Dockerfile 的時(shí)候,要經(jīng)常提醒自己兼耀,這并不是在寫 Shell 腳本压昼,而是在定義每一層該如何構(gòu)建
語法規(guī)則:
- From:表示新的鏡像從以那個(gè)鏡像為基礎(chǔ)進(jìn)行構(gòu)建
- MAINTAINER:指定鏡像的創(chuàng)建者
- ENV:設(shè)置環(huán)境變量
- RUN:運(yùn)行shell命令,如果有多條命令可以用 && 連接
RUN apt-get update
RUN [ "apt-get", "update" ]
- COPY:將編譯機(jī)本地文件拷貝到鏡像文件系統(tǒng)中
- EXPOSE:指定監(jiān)聽的端口
- ENTRYPOINT:創(chuàng)建的容器啟動(dòng)后才執(zhí)行
- CMD:和RUN命令相似瘤运,CMD可以用于執(zhí)行特定的命令巢音。和RUN不同的是,這些命令不是在鏡像構(gòu)建的過程中執(zhí)行的尽超,而是在用鏡像構(gòu)建容器后被調(diào)用官撼。
上下文路徑:
上下文路徑,是指 docker 在構(gòu)建鏡像似谁,有時(shí)候想要使用到本機(jī)的文件(比如復(fù)制)傲绣,docker build 命令得知這個(gè)路徑后,會(huì)將路徑下的所有內(nèi)容打包巩踏。
解析:由于 docker 的運(yùn)行模式是 C/S秃诵。我們本機(jī)是 C,docker 引擎是 S塞琼。實(shí)際的構(gòu)建過程是在 docker 引擎下完成的菠净,所以這個(gè)時(shí)候無法用到我們本機(jī)的文件。這就需要把我們本機(jī)的指定目錄下的文件一起打包提供給 docker 引擎使用。
如果未說明最后一個(gè)參數(shù)毅往,那么默認(rèn)上下文路徑就是 Dockerfile 所在的位置牵咙。
注意:上下文路徑下不要放無用的文件,因?yàn)闀?huì)一起打包發(fā)送給 docker 引擎攀唯,如果文件過多會(huì)造成過程緩慢洁桌。