亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

目錄
  • Docker 鏡像的構(gòu)建原理和方式
  • 通過(guò)docker commit命令,基于一個(gè)已存在的容器構(gòu)建出鏡像
  • 編寫 Dockerfile 文件,并使用docker build命令來(lái)構(gòu)建鏡像
  • 通過(guò)docker save和docker load命令構(gòu)建
  • 通過(guò)docker export和docker import命令構(gòu)建

Docker 鏡像的構(gòu)建原理和方式

Docker構(gòu)建鏡像的方式有多種,先介紹下最常用的兩種

  • 通過(guò)docker commit命令,基于一個(gè)已存在的容器構(gòu)建出鏡像。
  • 編寫 Dockerfile 文件,并使用docker build命令來(lái)構(gòu)建鏡像。

上面這兩種方法中,鏡像構(gòu)建的底層原理是相同的,都是通過(guò)下面 3 個(gè)步驟來(lái)構(gòu)建鏡像:

  • 基于原鏡像,啟動(dòng)一個(gè) Docker 容器。在容器中進(jìn)行一些操作,例如執(zhí)行命令、安裝文件等。
  • 由這些操作產(chǎn)生的文件變更都會(huì)被記錄在容器的存儲(chǔ)層中。
  • 將容器存儲(chǔ)層的變更 commit 到新的鏡像層中,并添加到原鏡像上。

下面,具體了解這兩種構(gòu)建 Docker 鏡像的方式。

通過(guò)docker commit命令,基于一個(gè)已存在的容器構(gòu)建出鏡像

通過(guò)docker commit來(lái)構(gòu)建一個(gè)鏡像,命令的格式為docker commit [選項(xiàng)] [<倉(cāng)庫(kù)名>[:<標(biāo)簽>]]。

Docker制作鏡像的兩種實(shí)現(xiàn)方式

具體步驟如下:

  • 執(zhí)行docker ps獲取需要構(gòu)建鏡像的容器 ID 08cd43c7e50d
  • 執(zhí)行docker pause 08cd43c7e50d暫停08cd43c7e50d容器的運(yùn)行。
  • 執(zhí)行docker commit 08cd43c7e50d redis:test,基于容器 ID 08cd43c7e50d構(gòu)建 Docker 鏡像。
  • 執(zhí)行docker images redis:test,查看鏡像是否成功構(gòu)建。

這種鏡像構(gòu)建方式通常用在下面兩個(gè)場(chǎng)景中:

  • 構(gòu)建臨時(shí)的測(cè)試鏡像;
  • 容器被入侵后,使用docker commit,基于被入侵的容器構(gòu)建鏡像,從而保留現(xiàn)場(chǎng),方便以后追溯。

除了這兩種場(chǎng)景,不建議你使用docker commit來(lái)構(gòu)建生產(chǎn)現(xiàn)網(wǎng)環(huán)境的鏡像。

主要原因有兩個(gè):

  • 使用docker commit構(gòu)建的鏡像包含了編譯構(gòu)建、安裝軟件,以及程序運(yùn)行產(chǎn)生的大量無(wú)用文件,這會(huì)導(dǎo)致鏡像體積很大,非常臃腫。
  • 使用docker commit構(gòu)建的鏡像會(huì)丟失掉所有對(duì)該鏡像的操作歷史,無(wú)法還原鏡像的構(gòu)建過(guò)程,不利于鏡像的維護(hù)。

編寫 Dockerfile 文件,并使用docker build命令來(lái)構(gòu)建鏡像

docker build命令會(huì)讀取Dockerfile的內(nèi)容,并將Dockerfile的內(nèi)容發(fā)送給 Docker 引擎,最終 Docker 引擎會(huì)解析Dockerfile中的每一條指令,構(gòu)建出需要的鏡像。

docker build的命令格式為docker build [OPTIONS] PATH | URL | -。PATH、URL、-指出了構(gòu)建鏡像的上下文(context),context 中包含了構(gòu)建鏡像需要的Dockerfile文件和其他文件。默認(rèn)情況下,Docker 構(gòu)建引擎會(huì)查找 context 中名為Dockerfile的文件,但你可以通過(guò)-f, --file選項(xiàng),手動(dòng)指定Dockerfile文件。例如:

 $ docker build -f Dockerfile -t redis:test .

使用 Dockerfile 構(gòu)建鏡像,本質(zhì)上也是通過(guò)鏡像創(chuàng)建容器,并在容器中執(zhí)行相應(yīng)的指令,然后停止容器,提交存儲(chǔ)層的文件變更。和用docker commit構(gòu)建鏡像的方式相比,它有三個(gè)好處:

  • Dockerfile 包含了鏡像制作的完整操作流程,其他開(kāi)發(fā)者可以通過(guò) Dockerfile 了解并復(fù)現(xiàn)制作過(guò)程。
  • Dockerfile 中的每一條指令都會(huì)創(chuàng)建新的鏡像層,這些鏡像可以被 Docker Daemnon 緩存。再次制作鏡像時(shí),Docker 會(huì)盡量復(fù)用緩存的鏡像層(using cache),而不是重新逐層構(gòu)建,這樣可以節(jié)省時(shí)間和磁盤空間。
  • Dockerfile 的操作流程可以通過(guò)docker image history [鏡像名稱]查詢,方便開(kāi)發(fā)者查看變更記錄。

執(zhí)行docker build后的構(gòu)建流程為:

第一步,docker build會(huì)將 context 中的文件打包傳給 Docker daemon。如果 context 中有.dockerignore文件,則會(huì)從上傳列表中刪除滿足.dockerignore規(guī)則的文件。

  • 這里有個(gè)例外,如果.dockerignore文件中有.dockerignore或者Dockerfiledocker build命令在排除文件時(shí)會(huì)忽略掉這兩個(gè)文件。如果指定了鏡像的 tag,還會(huì)對(duì) repository 和 tag 進(jìn)行驗(yàn)證。

第二步,docker build命令向 Docker server 發(fā)送 HTTP 請(qǐng)求,請(qǐng)求 Docker server 構(gòu)建鏡像,請(qǐng)求中包含了需要的 context 信息。

第三步,Docker server 接收到構(gòu)建請(qǐng)求之后,會(huì)執(zhí)行以下流程來(lái)構(gòu)建鏡像:

  • 創(chuàng)建一個(gè)臨時(shí)目錄,并將 context 中的文件解壓到該目錄下。
  • 讀取并解析 Dockerfile,遍歷其中的指令,根據(jù)命令類型分發(fā)到不同的模塊去執(zhí)行。
  • Docker 構(gòu)建引擎為每一條指令創(chuàng)建一個(gè)臨時(shí)容器,在臨時(shí)容器中執(zhí)行指令,然后 commit 容器,生成一個(gè)新的鏡像層。
  • 最后,將所有指令構(gòu)建出的鏡像層合并,形成 build 的最后結(jié)果。最后一次 commit 生成的鏡像 ID 就是最終的鏡像 ID。

為了提高構(gòu)建效率,docker build默認(rèn)會(huì)緩存已有的鏡像層。如果構(gòu)建鏡像時(shí)發(fā)現(xiàn)某個(gè)鏡像層已經(jīng)被緩存,就會(huì)直接使用該緩存鏡像,而不用重新構(gòu)建。如果不希望使用緩存的鏡像,可以在執(zhí)行docker build命令時(shí),指定--no-cache=true參數(shù)。

Docker 匹配緩存鏡像的規(guī)則為:遍歷緩存中的基礎(chǔ)鏡像及其子鏡像,檢查這些鏡像的構(gòu)建指令是否和當(dāng)前指令完全一致,如果不一樣,則說(shuō)明緩存不匹配。對(duì)于ADDCOPY指令,還會(huì)根據(jù)文件的校驗(yàn)和(checksum)來(lái)判斷添加到鏡像中的文件是否相同,如果不相同,則說(shuō)明緩存不匹配。

這里要注意,緩存匹配檢查不會(huì)檢查容器中的文件。比如,當(dāng)使用RUN apt-get -y update命令更新了容器中的文件時(shí),緩存策略并不會(huì)檢查這些文件,來(lái)判斷緩存是否匹配。

最后,可以通過(guò)docker history命令來(lái)查看鏡像的構(gòu)建歷史,如下圖所示:

Docker制作鏡像的兩種實(shí)現(xiàn)方式

通過(guò)docker save和docker load命令構(gòu)建

docker save用來(lái)將鏡像保存為一個(gè) tar 文件,docker load用來(lái)將 tar 格式的鏡像文件加載到當(dāng)前機(jī)器上,例如:

# 在 A 機(jī)器上執(zhí)行,并將 nginx-v1.0.0.tar.gz 復(fù)制到 B 機(jī)器
$ docker save nginx | gzip > nginx-v1.0.0.tar.gz
# 在 B 機(jī)器上執(zhí)行
$ docker load -i nginx-v1.0.0.tar.gz

通過(guò)上面的命令,我們就在機(jī)器 B 上創(chuàng)建了nginx鏡像。

通過(guò)docker export和docker import命令構(gòu)建

通過(guò)docker export 保存容器的鏡像,再通過(guò)docker import 加載鏡像,具體命令如下:

# 在 A 機(jī)器上執(zhí)行,并將 nginx-v1.0.0.tar.gz 復(fù)制到 B 機(jī)器
$ docker export nginx > nginx-v1.0.0.tar.gz
# 在 B 機(jī)器上執(zhí)行
$ docker import - nginx:v1.0.0 nginx-v1.0.0.tar.gz

通過(guò)docker export導(dǎo)出的鏡像和通過(guò)docker save保存的鏡像相比,會(huì)丟失掉所有的鏡像構(gòu)建歷史。在實(shí)際生產(chǎn)環(huán)境中,我不建議你通過(guò)docker save和docker export這兩種方式來(lái)創(chuàng)建鏡像。

較推薦的方式是:在 A 機(jī)器上將鏡像 push 到鏡像倉(cāng)庫(kù),在 B 機(jī)器上從鏡像倉(cāng)庫(kù) pull 該鏡像。

分享到:
標(biāo)簽:兩種 制作 方式 服務(wù)器 鏡像
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定