日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

淺析Docker鏡像本地存儲機制及容器啟動原理

出處:維庫電子市場網(wǎng) 發(fā)布于:2017-10-19 15:16:13

Docker是一個開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個輕量級的、可移植的、自給自足的容器。開發(fā)者在筆記本上編譯測試通過的容器可以批量地在生產(chǎn)環(huán)境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎(chǔ)應(yīng)用平臺。
  近幾年 Docker 風靡技術(shù)圈,不少從業(yè)人員都或多或少使用過,也了解如何通過 Dockerfile 構(gòu)建鏡像,從遠程鏡像倉庫拉取自己所需鏡像,推送構(gòu)建好的鏡像至遠程倉庫,根據(jù)鏡像運行容器等。這個過程十分簡單,只需執(zhí)行 docker build、docker pull、docker push、docker run 等操作即可。但大家是否想過鏡像在本地到底是如何存儲的?容器又是如何根據(jù)鏡像啟動的?推送鏡像至遠程鏡像倉庫時,服務(wù)器又是如何存儲的呢?
  

  Docker 鏡像本地存儲機制及容器啟動原理
  Docker 鏡像不是一個單一的文件,而是有多層構(gòu)成。我們可通過 docker images 獲取本地的鏡像列表及對應(yīng)的元信息, 接著可通過docker history 《imageId》 查看某個鏡像各層內(nèi)容及對應(yīng)大小,每層對應(yīng)著 Dockerfile 中的一條指令。Docker 鏡像默認存儲在 /var/lib/docker/《storage-driver》中,可通過 DOCKER_OPTS 或者 docker daemon 運行時指定 --graph= 或 -g 指定。
  Docker 使用存儲驅(qū)動來管理鏡像每層內(nèi)容及可讀寫的容器層,存儲驅(qū)動有 DeviceMapper、AUFS、Overlay、Overlay2、Btrfs、ZFS 等,不同的存儲驅(qū)動實現(xiàn)方式有差異,鏡像組織形式可能也稍有不同,但都采用棧式存儲,并采用 Copy-on-Write(CoW) 策略。且存儲驅(qū)動采用熱插拔架構(gòu),可動態(tài)調(diào)整。那么,存儲驅(qū)動那么多,該如何選擇合適的呢?大致可從以下幾方面考慮:
  若內(nèi)核支持多種存儲驅(qū)動,且沒有顯式配置,Docker 會根據(jù)它內(nèi)部設(shè)置的優(yōu)先級來選擇。優(yōu)先級為 AUFS 》 Btrfs/ZFS 》 Overlay2 》 Overlay 》 DeviceMapper。若使用 DeviceMapper 的話,在生產(chǎn)環(huán)境,一定要選擇 direct-lvm, loopback-lvm 性能非常差。
  選擇會受限于 Docker 版本、操作系統(tǒng)、系統(tǒng)版本等。例如,AUFS 只能用于 Ubuntu 或 Debian 系統(tǒng),Btrfs 只能用于 SLES (SUSE Linux Enterprise Server, 僅 Docker EE 支持)。
  有些存儲驅(qū)動依賴于后端的文件系統(tǒng)。例如,Btrfs 只能運行于后端文件系統(tǒng) Btrfs 上。
  不同的存儲驅(qū)動在不同的應(yīng)用場景下性能不同。例如,AUFS、Overlay、Overlay2 操作在文件級別,內(nèi)存使用相對更高效,但大文件讀寫時,容器層會變得很大;DeviceMapper、Btrfs、ZFS 操作在塊級別,適合工作在寫負載高的場景;容器層數(shù)多,且寫小文件頻繁時,Overlay 效率比 Overlay2 更高;Btrfs、ZFS 更耗內(nèi)存。
  Docker 容器其實是在鏡像的上層加了一層讀寫層,通常也稱為容器層。在運行中的容器里做的所有改動,如寫新文件、修改已有文件、刪除文件等操作其實都寫到了容器層。容器層刪除了,上層的讀寫層跟著也刪除了,改動自然也丟失了。若要持久化這些改動,須通過 docker commit 《containerId》 [repository[:tag]] 將當前容器保存成為一個新鏡像。若想將數(shù)據(jù)持久化,或是多個容器間共享數(shù)據(jù),需將數(shù)據(jù)存儲在 Docker volume 中,并將 volume 掛載到相應(yīng)容器中。
  存儲驅(qū)動決定了鏡像及容器在文件系統(tǒng)中的存儲方式及組織形式,下面分別對常見的 AUFS、Overlay 作一簡單介紹。
  AUFS
  AUFS 是 Debian (Stretch 之前的版本,Stretch默認采用 Overlay2) 或 Ubuntu 系統(tǒng)上 Docker 的默認存儲驅(qū)動,也是 Docker 所有存儲驅(qū)動中為成熟的。具有啟動快,內(nèi)存、存儲使用高效等特點。如果使用的 Linux 內(nèi)核版本為 4.0 或更高,且使用的是 Docker CE,可考慮使用Overlay2 (比 AUFS 性能更佳)。
  配置 AUFS 存儲驅(qū)動
  ① 驗證內(nèi)核是否支持 AUFS
  $ grep aufs /proc/filesystems nodev aufs
 ?、?若內(nèi)核支持,可在 docker 啟動時通過指定參數(shù) --storage-driver=aufs 選擇 AUFS
  AUFS 存儲驅(qū)動工作原理
  采用 AUFS 存儲驅(qū)動時,有關(guān)鏡像和容器的所有層信息都存儲在 /var/lib/docker/aufs/ 目錄下,下面有三個子目錄:
  /diff:每個目錄中存儲著每層鏡像包含的真實內(nèi)容
  /layers:存儲有關(guān)鏡像層組織的元信息,文件內(nèi)容存儲著該鏡像的組建鏡像列表
  /mnt:掛載點信息存儲,當創(chuàng)建容器后,mnt 目錄下會多出容器對應(yīng)的層及該容器的 init 層。目錄名稱與容器 ID 不一致。實際的讀寫層存儲在 /var/lib/docker/aufs/diff,直到容器刪除,此讀寫層才會被清除掉。
  采用 AUFS 后容器如何讀寫文件?
  容器進行讀文件操作有以下三種場景:
  容器層不存在: 要讀取的文件在容器層中不存在,存儲驅(qū)動會從鏡像層逐層向下找,多個鏡像層中若存在同名文件,上層的有效。
  文件只存在容器層:讀取容器層文件
  容器層與鏡像層同時存在:讀取容器層文件
  修改文件或目錄
  容器中進行文件的修改同樣存在三種場景:
  次寫文件:若待修改的文件在某個鏡像層中,AUFS 會先執(zhí)行 copy_up 操作將文件從只讀的鏡像層拷貝到可讀寫的容器層,然后進行修改。在文件非常大的情況下效率比較低下。
  刪除文件:刪除文件時,若文件在鏡像層,其實是在容器層創(chuàng)建一個特殊的 writeout 文件,容器層訪問不到,并沒有實際刪掉。
  目錄重命名:目前 AUFS 還不支持目錄重命名。
  OverlayFS
  OverlayFS 是一種類似 AUFS 的現(xiàn)代聯(lián)合文件系統(tǒng),但實現(xiàn)更簡單,性能更優(yōu)。OverlayFS 嚴格說來是 Linux 內(nèi)核的一種文件系統(tǒng),對應(yīng)的 Docker 存儲驅(qū)動為 Overlay 或者 Overlay2,Overlay2 需 Linux 內(nèi)核 4.0 及以上,Overlay 需內(nèi)核 3.18 及以上。且目前僅 Docker 社區(qū)版支持。條件許可的話,盡量使用 Overlay2,與 Overlay 相比,它的 inode 利用率更高。
  容器如何使用 Overlay/Overlay2 讀寫文件
  讀文件存在以下三種場景:
  文件不存在容器層:若容器要讀的文件不在容器層,會繼續(xù)從底層的鏡像層找
  文件僅在容器層:若容器要讀的文件在容器層,直接讀取,不用在底層的鏡像層查找
  文件同時在容器層和鏡像層:若容器要讀的文件在容器層和鏡像層中都存在,則從容器層讀取
  修改文件或目錄
  寫文件存在以下三種場景:
  首次寫文件:若要寫的文件位于鏡像層中,則執(zhí)行 copy_up 將文件從鏡像層拷貝至容器層,然后進行修改,并在容器層保存一份新的。若文件較大,效率較低。OverlayFS 工作在文件級別而不是塊級別,這意味著即使對文件稍作修改且文件很大,也須將整個文件拷貝至容器層進行修改。但需注意的是,copy_up 操作僅發(fā)生在首次,后續(xù)對同一文件進行修改,操作容器層文件即可
  刪除文件或目錄:容器中刪除文件或目錄時,其實是在容器中創(chuàng)建了一個 writeout 文件,并沒有真的刪除文件,只是使其對用戶不可見
  目錄重命名:僅當源路徑與目標路徑都在容器層時,調(diào)用 rename(2) 函數(shù)才成功,否則返回 EXDEV
  遠程鏡像倉庫如何存儲鏡像?
  不少人可能經(jīng)常使用 Docker,那么有沒有思考過鏡像推送至遠程鏡像倉庫,是如何保存的呢?Docker 客戶端是如何與遠程鏡像倉庫交互的呢?
  我們平時本地安裝的 Docker 其實包含兩部分:docker client 與 docker engine,docker client 與 docker engine 間通過 API 進行通信。Docker engine 提供的 API 大致有、容器、鏡像、網(wǎng)絡(luò)、卷、swarm 等。Docker engine 與 registry (即:遠程鏡像倉庫)的通信也有一套完整的 API,大致包含 pull、push 鏡像所涉及的、授權(quán)、鏡像存儲等相關(guān)流程,。目前常用 Registry 版本為 v2,Registry v2 擁有斷點續(xù)傳、并發(fā)拉取鏡像多層等特點。能并發(fā)拉取多層是因為鏡像的元信息與鏡像層數(shù)據(jù)分開存儲,當 pull 一個鏡像時,先進行獲取到 token 并授權(quán)通過,然后獲取鏡像的 manifest 文件,進行 signature 校驗。校驗完成后,依據(jù) manifest 里的層信息并發(fā)拉取各層。其中 manifest 包含的信息有:倉庫名稱、tag、鏡像層 digest 等。各層拉下來后,也會先在本地進行校驗,校驗算法采用 sha256。Push 過程則先將鏡像各層并發(fā)推至 Registry,推送完成后,再將鏡像的 manifest 推至 Registry。Registry 其實并不負責具體的存儲工作,具體存儲介質(zhì)根據(jù)使用方來定,Registry 只是提供一套標準的存儲驅(qū)動接口,具體存儲驅(qū)動實現(xiàn)由使用方實現(xiàn)。
  目前 Registry 默認提供的存儲驅(qū)動包括:微軟 Azure、Google gcs、Amazon s3、OpenStack swift、阿里云 OSS、本地存儲等。若需要使用自己的對象存儲服務(wù),則需要自行實現(xiàn) registry 存儲驅(qū)動。網(wǎng)易云目前將鏡像存儲在自己的對象存儲服務(wù) nos 上,故專門針對 nos 實現(xiàn)了一套存儲驅(qū)動,另外服務(wù)也對接了網(wǎng)易云服務(wù),并結(jié)合自身業(yè)務(wù)實現(xiàn)了一套、授權(quán)邏輯,并有效地限制了倉庫配額。
  Registry 干的事情其實很簡單,大致可分為:
 ?、?讀配置 ;
 ?、?注冊 handler ;
 ?、?監(jiān)聽。本質(zhì)上 Registry 是個 HTTP 服務(wù),啟動后,監(jiān)聽在配置文件設(shè)定的某端口上。當 http 請求過來后,便會觸發(fā)之前注冊過的 Handler。Handler 包含 manifest、tag、blob、blob-upload、blob-upload-chunk、catalog 等六類。配置文件包含監(jiān)聽端口、auth 地址、存儲驅(qū)動信息、回調(diào)通知等。
關(guān)鍵詞:淺析Docker鏡像本地存儲機制及容器啟動原理

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!