【Docker】容器鏡像有哪些特性

首先解釋一下什么是Docker鏡像?

?

Docker鏡像它其實是一個模板,擁有這個模板我們才能創建我們的Docker容器,鏡像里含有啟動 docker 容器所需的文件系統結構及其內容,因此是啟動一個 docker 容器的基礎。docker 鏡像的文件內容以及一些運行 docker 容器的配置文件組成了 docker 容器的靜態文件系統運行環境:rootfs。可以這么理解,docker 鏡像是 docker 容器的靜態視角,docker 容器是 docker 鏡像的運行狀態。我們可以通過下圖來理解 docker daemon、docker 鏡像以及 docker 容器三者的關系(此圖來自互聯網):

圖片

從上圖中我們可以看到,當由 ubuntu:14.04 鏡像啟動容器時,ubuntu:14.04 鏡像的鏡像層內容將作為容器的 rootfs;而 ubuntu:14.04 鏡像的 json 文件,會由 docker daemon 解析,并提取出其中的容器執行入口 CMD 信息,以及容器進程的環境變量 ENV 信息,最終初始化容器進程。當然,容器進程的執行入口來源于鏡像提供的 rootfs。

?

rootfs解釋

rootfs 是 docker 容器在啟動時內部進程可見的文件系統,即 docker 容器的根目錄。rootfs 通常包含一個操作系統運行所需的文件系統,例如可能包含典型的類 Unix 操作系統中的目錄系統,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 及運行 docker 容器所需的配置文件、工具等。
在傳統的 Linux 操作系統內核啟動時,首先掛載一個只讀的 rootfs,當系統檢測其完整性之后,再將其切換為讀寫模式。而在 docker 架構中,當 docker daemon 為 docker 容器掛載 rootfs 時,沿用了 Linux 內核啟動時的做法,即將 rootfs 設為只讀模式。在掛載完畢之后,利用聯合掛載(union mount)技術在已有的只讀 rootfs 上再掛載一個讀寫層。這樣,可讀寫的層處于 docker 容器文件系統的最頂層,其下可能聯合掛載了多個只讀的層,只有在 docker 容器運行過程中文件系統發生變化時,才會把變化的文件內容寫到可讀寫層,并隱藏只讀層中的舊版本文件。

Docker 鏡像的主要特征

為了更好的理解 docker 鏡像的結構,下面介紹一下 docker 鏡像設計上的關鍵技術。

1、分層

docker 鏡像是采用分層的方式構建的,每個鏡像都由一系列的 "鏡像層" 組成。分層結構是 docker 鏡像如此輕量的重要原因。當需要修改容器鏡像內的某個文件時,只對處于最上方的讀寫層進行變動,不覆寫下層已有文件系統的內容,已有文件在只讀層中的原始版本仍然存在,但會被讀寫層中的新版本所隱藏。當使用 docker commit 提交這個修改過的容器文件系統為一個新的鏡像時,保存的內容僅為最上層讀寫文件系統中被更新過的文件。分層達到了在不的容器同鏡像之間共享鏡像層的效果。

圖片

2、寫時復制(copy-on-write)docker 鏡像使用了寫時復制(copy-on-write)的策略,在多個容器之間共享鏡像,每個容器在啟動的時候并不需要單獨復制一份鏡像文件,而是將所有鏡像層以只讀的方式掛載到一個掛載點,再在上面覆蓋一個可讀寫的容器層。在未更改文件內容時,所有容器共享同一份數據,只有在 docker 容器運行過程中文件系統發生變化時,才會把變化的文件內容寫到可讀寫層,并隱藏只讀層中的老版本文件。寫時復制配合分層機制減少了鏡像對磁盤空間的占用和容器啟動時間。

圖片

3、內容尋址(content-addressable storage)

在 docker 1.10 版本后,docker 鏡像改動較大,其中最重要的特性便是引入了內容尋址存儲(content-addressable storage) 的機制,根據文件的內容來索引鏡像和鏡像層。與之前版本對每個鏡像層隨機生成一個 UUID 不同,新模型對鏡像層的內容計算校驗和,生成一個內容哈希值,并以此哈希值代替之前的 UUID 作為鏡像層的唯一標識。該機制主要提高了鏡像的安全性,并在 pull、push、load 和 save 操作后檢測數據的完整性。另外,基于內容哈希來索引鏡像層,在一定程度上減少了 ID 的沖突并且增強了鏡像層的共享。對于來自不同構建的鏡像層,主要擁有相同的內容哈希,也能被不同的鏡像共享。

4、UnionFS聯合掛載文件系統
聯合掛載技術可以在一個掛載點同時掛載多個文件系統,將掛載點的原目錄與被掛載內容進行整合,使得最終可見的文件系統將會包含整合之后的各層的文件和目錄。實現這種聯合掛載技術的文件系統通常被稱為聯合文件系統(union filesystem)。以下圖所示的運行 Ubuntu:14.04 鏡像后的容器中的 aufs 文件系統為例:

圖片

由于初始掛載時讀寫層為空,所以從用戶的角度看,該容器的文件系統與底層的 rootfs 沒有差別;然而從內核的角度看,則是顯式區分開來的兩個層次。當需要修改鏡像內的某個文件時,只對處于最上方的讀寫層進行了變動,不復寫下層已有文件系統的內容,已有文件在只讀層中的原始版本仍然存在,但會被讀寫層中的新版本文件所隱藏,當 docker commit 這個修改過的容器文件系統為一個新的鏡像時,保存的內容僅為最上層讀寫文件系統中被更新過的文件。聯合掛載是用于將多個鏡像層的文件系統掛載到一個掛載點來實現一個統一文件系統視圖的途徑,是下層存儲驅動(aufs、overlay等) 實現分層合并的方式。所以嚴格來說,聯合掛載并不是 docker 鏡像的必需技術,比如在使用 device mapper 存儲驅動時,其實是使用了快照技術來達到分層的效果。

Docker 鏡像的存儲組織方式

綜合考慮鏡像的層級結構,以及 volume、init-layer、可讀寫層這些概念,一個完整的、在運行的容器的所有文件系統結構可以用下圖來描述:

圖片

從圖中我們不難看到,除了 echo hello 進程所在的 cgroups 和 namespace 環境之外,容器文件系統其實是一個相對獨立的組織。可讀寫部分(read-write layer 以及 volumes)、init-layer、只讀層(read-only layer) 這 3 部分結構共同組成了一個容器所需的下層文件系統,它們通過聯合掛載的方式巧妙地表現為一層,使得容器進程對這些層的存在一無所知。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx中的location指令

1、location 介紹 location是Nginx中的塊級指令(block directive),location指令的功能是用來匹配不同的url請求,進而對請求做不同的處理和響應,這其中較難理解的是多個location的匹配順序,本文會作為重點來解釋和說明。 開始之前…

容器底層實現技術Namespace/Cgroup

Docker容器實現原理 Docker容器在實現上是通過namespace技術來進行進程隔離,通過cgroup技術實現容器進程可用資源的限制,當docker啟動一個容器時,實際是創建了多了namespace參數的進程。 Namespace Namespace:命名空間 作用&#…

身體原因 斷更一周

由于眾所周知的原因,博主最近具有發熱、全身乏力、酸痛、干咳等癥狀,已嚴重影響日常的工作學習和博客編寫,所以斷更我將一周,由下周三(即2022年12月21日)恢復更新 更多往期內容可以參考:全網最…

異方差與多重共線性對回歸問題的影響

異方差的檢驗 1.異方差的畫圖觀察 2.異方差的假設檢驗,假設檢驗有兩種,一般用懷特檢驗使用方法在ppt中,課程中也有實驗,是一段代碼。 異方差的解決辦法 多重共線性 多重共線性可能帶來的影響: 多重共線性的檢驗 多重…

如何修改Docker的鏡像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的國內鏡像源鏡像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重啟Docker服務 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模塊

ngxhttprewrite_module 模塊用來使用正則表達式(PCRE)改變請求的 URI,返回重定向,并有條件地選擇配置。 指令執行順序 首先順序執行 server 塊中的 rewrite 模塊指令,得到 rewrite 后的請求 URI 然后循環執行如下指令…

所有的Python庫

庫名稱簡介 Chardet字符編碼探測器,可以自動檢測文本、網頁、xml的編碼。 colorama主要用來給文本添加各種顏色,并且非常簡單易用。 Prettytable主要用于在終端或瀏覽器端構建格式化的輸出。 difflib,[Python]標準庫,計算文本…

Oracle行轉列語法總結大全

一、decode語法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各種符號 之 含義

#!&#xff1a;符號能夠被內核識別成是一個腳本的開始&#xff0c;這一行必須位于腳本的首行 $0&#xff1a;當前腳本的名字 $#&#xff1a;輸入<調用>參數(腳本或函數的位置參數) 的個數&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11個執行流程

1 Nginx簡介 Web服務器市場份額 Nginx [engine x] 最初由 Lgor Sysoev 編寫。根據 Netcraft 的數據&#xff0c;到2020年9月&#xff0c;Nginx 服務或代理了25.76&#xff05;站點&#xff0c;市場份額占到了約34.03&#xff05;。 Nginx 被廣泛用作&#xff1a; HTTP服務器…

Nginx的執行階段詳解

在了解nginx的執行階段前&#xff0c;先看一個例子 對echo不熟悉的&#xff0c;可以先看文章Nginx調試必備了解下echo擴展 回到上面這個例子&#xff0c;在server塊中配置這樣的location&#xff0c;你覺得輸出是什么樣子&#xff1f; 按照正常的邏輯&#xff0c;輸出應該是32 …

Docker掛了,數據如何找回

docker在實際使用中&#xff0c;讓運維人員詬病的&#xff0c;除了安全問題外&#xff0c;大概就是數據的問題了 很多人在初用docker的時候&#xff0c;很多時候都忘記或不知道docker中需要保留的數據需要掛載到宿主機文件夾到容器內部對應目錄&#xff08;當然除了掛載宿主機目…

TCP總結

TCP這些東西&#xff0c;基本每個程序猿都或多或少是掌握的了。雖然感覺在實際開發中沒有什么用武之處&#xff0c;但&#xff0c;面試他要問啊 而最近大家伙過完年&#xff0c;也都在準備春招&#xff0c;我也一樣。閱讀了一些okHttp源碼之后&#xff0c;又屁顛屁顛地跑回來重…

Shell 中各種括號的作用

一、小括號&#xff0c;圓括號&#xff08;&#xff09; 1、單小括號 () ①命令組。括號中的命令將會新開一個子shell順序執行&#xff0c;所以括號中的變量不能夠被腳本余下的部分使用。括號中多個命令之間用分號隔開&#xff0c;最后一個命令可以沒有分號&#xff0c;各命令和…

linux基線核查腳本

#!/bin/bash #version 2.0cat <<EOF ************************************************************************************* ***** linux基線檢查腳本 ***** ************************************************************************************* *…

LDAP命令介紹---dsreplication

可以使用此實用程序來配置服務器之間的復制, 以使服務器數據保持同步。要正確進行復制, 必須先使用 enable 子命令啟用復制, 然后再使用 initialize 子命令將一個服務器的內容初始化為另一個服務器的內容用法: dsreplication {子命令} {選項}可用子命令:disable對指定服務器中…

LDAP命令介紹---dsconfig

此實用程序可用于定義目錄服務器的基本配置 用法: dsconfig {子命令} {選項} 獲取子命令用法列表: --help-distribution 顯示與 分發 相關的子命令 --help-general-configuration 顯示與 一般配置 相關的子命令 --help-integration 顯示與 集成 相關的子命令 --…

LDAP命令介紹---dsconfig子命令----help-distribution顯示與分發相關的子命令

此實用程序可用于定義目錄服務器的基本配置用法: dsconfig {子命令} {選項}可用子命令:create-distribution-algorithm創建分發算法create-distribution-partition創建分發分區create-workflow-element --type distribution創建分發工作流元素create-global-index創建全局索引…

LDAP命令介紹---ldappasswordmodify口令修改操作

此實用程序可用于在目錄服務器中執行 LDAP 口令修改操作用法: ldappasswordmodify {選項}其中 {選項} 包括:-a, --authzID {authzID}應更改口令的用戶條目的授權 ID -A, --provideDNForAuthzID將綁定 DN 用作口令修改操作的授權 ID -n, --newPassword {newPassword}為目標用戶…

LDAP命令介紹---dstune

此實用程序可用于幫助您優化 OUD 目錄服務器。 您可以選擇自動或基于其他標準 (例如, 內存限制或服務器將包含的數據) 優化服務器用法: dstune {子命令} {選項}可用子命令:data-based使用描述目錄服務器將包含的數據的信息優化服務器。使用 --ldifFile 可基于 LDIF 文件的內容…