欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年07月05日 11:04:43   作者:_wei丶  
本文主要介紹了Docker制作鏡像的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

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

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

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

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

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

通過docker commit來構(gòu)建一個鏡像,命令的格式為docker commit [選項] [<倉庫名>[:<標簽>]]。

具體步驟如下:

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

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

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

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

主要原因有兩個:

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

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

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

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

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

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

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

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

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

  • 這里有個例外,如果.dockerignore文件中有.dockerignore或者Dockerfile,docker build命令在排除文件時會忽略掉這兩個文件。如果指定了鏡像的 tag,還會對 repository 和 tag 進行驗證。

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

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

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

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

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

這里要注意,緩存匹配檢查不會檢查容器中的文件。比如,當使用RUN apt-get -y update命令更新了容器中的文件時,緩存策略并不會檢查這些文件,來判斷緩存是否匹配。

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

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

docker save用來將鏡像保存為一個 tar 文件,docker load用來將 tar 格式的鏡像文件加載到當前機器上,例如:

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

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

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

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

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

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

較推薦的方式是:在 A 機器上將鏡像 push 到鏡像倉庫,在 B 機器上從鏡像倉庫 pull 該鏡像。

到此這篇關(guān)于Docker制作鏡像的兩種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Docker制作鏡像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 將普通用戶加入Docker組,使用docker問題

    將普通用戶加入Docker組,使用docker問題

    這篇文章主要介紹了將普通用戶加入Docker組,使用docker問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • openwrt安裝docker并啟動的操作方法

    openwrt安裝docker并啟動的操作方法

    這篇文章主要介紹了openwrt安裝docker并啟動的操作方法,首先需要大家在軟件包中下載docker和dockerd,然后在建立軟連接,在系統(tǒng)加載時啟動docker服務(wù),感興趣的朋友一起看看吧
    2022-03-03
  • Docker拉取鏡像過慢或卡死的解決方法(親測有效)

    Docker拉取鏡像過慢或卡死的解決方法(親測有效)

    本文主要介紹了Docker拉取鏡像過慢或卡死的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 刪除docker容器中內(nèi)容后打包鏡像不變小問題及解決

    刪除docker容器中內(nèi)容后打包鏡像不變小問題及解決

    文章討論了在Docker中處理大壓縮包時遇到的問題,以及如何通過分層存儲和使用`docker load`與`docker import`命令來解決鏡像大小過大的問題
    2025-03-03
  • 如何進入、退出docker的container實現(xiàn)

    如何進入、退出docker的container實現(xiàn)

    這篇文章主要介紹了如何進入、退出docker的container實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Docker容器操作方法詳解

    Docker容器操作方法詳解

    Docker 在隔離的容器中運行進程。之前總結(jié)了Docker鏡像的使用詳解,本篇按照之前測試openGauss容器過程中總結(jié)出來使用Docker容器的常用命令
    2022-08-08
  • Docker方式安裝GitLab教程

    Docker方式安裝GitLab教程

    在Docker容器中安裝GitLab的步驟包括下載鏡像、配置數(shù)據(jù)目錄、啟動容器、獲取初始密碼并設(shè)置管理員密碼,GitLab鏡像不包含郵件傳輸代理,需額外配置
    2025-03-03
  • Docker四種網(wǎng)絡(luò)類型原理實例解析

    Docker四種網(wǎng)絡(luò)類型原理實例解析

    這篇文章主要介紹了Docker四種網(wǎng)絡(luò)類型原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 如何用docker部署kafka

    如何用docker部署kafka

    本文詳細介紹了使用Docker快速搭建Kafka集群的步驟,包括選用wurstmeister/kafka鏡像、配置文件修改、集群啟動與管理,適合需要在Docker環(huán)境中部署Kafka的開發(fā)者參考
    2024-09-09
  • 在?Docker?容器中運行?PHPMyAdmin的詳細步驟

    在?Docker?容器中運行?PHPMyAdmin的詳細步驟

    Docker是一個開源的應用容器引擎,它能夠?qū)崿F(xiàn)應用部署的自動化。此外,容器是完全使用沙箱機制,容器之間的環(huán)境相互獨立,不會相互干擾,接下來通過本文給大家介紹在?Docker?容器中運行?PHPMyAdmin的詳細步驟,感興趣的朋友一起看看吧
    2022-01-01

最新評論