天天看點

鏡像的概念

鏡像的概念

鏡像可以了解為應用程式的集裝箱,而docker用來裝卸集裝箱。

docker鏡像含有啟動容器所需要的檔案系統及其内容,是以,其用于建立并啟動容器。

docker鏡像采用分層建構機制,最底層為bootfs,其上為rootfs

  • bootfs:用于系統引導的檔案系統,包括bootloader和kernel,容器啟動完成後會被解除安裝以節約記憶體資源
  • rootfs:位于bootfs之上,表現為docker容器的根檔案系統
    • 傳統模式中,系統啟動之時,核心挂載rootfs會首先将其挂載為“隻讀”模式,完整性自檢完成後将其重新挂載為讀寫模式
    • docker中,rootfs由核心挂載為“隻讀”模式,而後通過“聯合挂載”技術額外挂載一個“可寫”層

注意:當删除容器時,這個容器自有的“可寫”層會一起被删除

鏡像的概念

docker鏡像層

鏡像的概念

位于下層的鏡像稱為父鏡像(parrent image),最底層的稱為基礎鏡像(base image);

最上層為“可讀寫”層,其下的均為“隻讀”層。

docker存儲驅動

docker提供了多種存儲驅動來實作不同的方式存儲鏡像,下面是常用的幾種存儲驅動:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • VFS

AUFS

AUFS(AnotherUnionFS)是一種Union FS,是檔案級的存儲驅動。AUFS是一個能透明覆寫一個或多個現有檔案系統的層狀檔案系統,把多層合并成檔案系統的單層表示。簡單來說就是支援将不同目錄挂載到同一個虛拟檔案系統下的檔案系統。這種檔案系統可以一層一層地疊加修改檔案。無論底下有多少層都是隻讀的,隻有最上層的檔案系統是可寫的。當需要修改一個檔案時,AUFS建立該檔案的一個副本,使用CoW将檔案從隻讀層複制到可寫層進行修改,結果也儲存在可寫層。在Docker中,底下的隻讀層就是image,可寫層就是Container。

AUFS檔案系統據說有3W行代碼,而ext4檔案系統卻隻有4000-5000行左右代碼,這些代碼是要被整合進核心的,後來AUFS申請要被合并進核心代碼的時候,linuz覺得它這代碼太過臃腫,于是拒絕了。是以AUFS這個檔案系統一直以來就不是linux核心中自有的檔案系統,想用AUFS這個檔案系統的話,必須自己向核心打更新檔并去編譯使用它,但redhat系列的作業系統一向以穩定著稱,不會幹這種出格的事,是以在redhat系列作業系統中使用AUFS并無可能。而ubuntu上的docker預設使用的就是AUFS。

OverlayFS

Overlay是Linux核心3.18後支援的,也是一種Union FS,和AUFS的多層不同的是Overlay隻有兩層:一個upper檔案系統和一個lower檔案系統,分别代表Docker的鏡像層和容器層。當需要修改一個檔案時,使用CoW将檔案從隻讀的lower複制到可寫的upper進行修改,結果也儲存在upper層。在Docker中,底下的隻讀層就是image,可寫層就是Container。目前最新的OverlayFS為Overlay2。

AUFS和Overlay都是聯合檔案系統,但AUFS有多層,而Overlay隻有兩層,是以在做寫時複制操作時,如果檔案比較大且存在比較低的層,則AUSF會慢一些。而且Overlay并入了linux kernel mainline,AUFS沒有。目前AUFS已基本被淘汰。

因為是一整個複制,是以耗時久,資源使用率打,故不經常改檔案和資料的前提下,推薦使用OverlayFS。

DeviceMapper

Device mapper是Linux核心2.6.9後支援的,提供的一種從邏輯裝置到實體裝置的映射架構機制,在該機制下,使用者可以很友善的根據自己的需要制定實作存儲資源的管理政策。AUFS和OverlayFS都是檔案級存儲,而Device mapper是塊級存儲,所有的操作都是直接對塊進行操作,而不是檔案。Device mapper驅動會先在塊裝置上建立一個資源池,然後在資源池上建立一個帶有檔案系統的基本裝置,所有鏡像都是這個基本裝置的快照,而容器則是鏡像的快照。是以在容器裡看到檔案系統是資源池上基本裝置的檔案系統的快照,并沒有為容器配置設定空間。當要寫入一個新檔案時,在容器的鏡像内為其配置設定新的塊并寫入資料,這個叫用時配置設定。當要修改已有檔案時,再使用CoW為容器快照配置設定塊空間,将要修改的資料複制到在容器快照中新的塊裡再進行修改。

OverlayFS是檔案級存儲,Device mapper是塊級存儲,當檔案特别大而修改的内容很小,Overlay不管修改的内容大小都會複制整個檔案,對大檔案進行修改顯然要比小檔案要消耗更多的時間,而塊級無論是大檔案還是小檔案都隻複制需要修改的塊,并不是整個檔案,在這種場景下,顯然device mapper要快一些。因為塊級的是直接通路邏輯盤,适合IO密集的場景。而對于程式内部複雜,大并發但少IO的場景,Overlay的性能相對要強一些。

DeviceMapper則是隻複制一備份内容,經常改變資料與檔案的話,使用DeviceMapper會更好。

docker registry

啟動容器時,docker daemon會試圖從本地擷取相關的鏡像,本地鏡像不存在時,其将從Registry中下載下傳該鏡像并儲存到本地。

Registry用于儲存docker鏡像,包括鏡像的層次結構和中繼資料。使用者可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分類:

  • Sponsor Registry:第三方的Registry,供客戶和Docker社群使用
  • Mirror Registry:第三方的Registry,隻讓客戶使用
  • Vendor Registry:由釋出docker鏡像的供應商提供的registry
  • Private Registry:通過設有防火牆和額外的安全層的私有實體提供的registry

docker registry的組成:

  • Repository
    • 由某特定的docker鏡像的所有疊代版本組成的鏡像倉庫
    • 一個Registry中可以存在多個Repository
      • Repository可分為“頂層倉庫”和“使用者倉庫”
      • 使用者倉庫名稱格式為“使用者名/倉庫名”
    • 每個倉庫可包含多個Tag(标簽),每個标簽對應一個鏡像
  • Index
    • 維護使用者帳戶、鏡像的檢驗以及公共命名空間的資訊
    • 相當于為Registry提供了一個完成使用者認證等功能的檢索接口

Docker Registry中的鏡像通常由開發人員制作,而後推送至“公共”或“私有”Registry上儲存,供其他人員使用,例如“部署”到生産環境。

鏡像的概念
鏡像的概念

建立鏡像

鏡像的概念

首頁

鏡像的概念

删除

鏡像的概念

docker event state

鏡像的概念

流程:

docker run 建立完直接啟動,而不需要再次輸入啟動指令

start狀态直接變為running運作狀态

running運作狀态可以用docker kill殺死程序,也可以用docker restart重新開機,重新開機則是先殺死,然後啟動進入重新開機狀态,然後再進入運作狀态

docker stop停止

殺死程序,然後停掉。停掉後來到stopped狀态,可以通過start來再次進入運作狀态

docker pause表示暫停

暫停狀态pause 可以使用unpause來取消暫停,再次進入運作狀态

killed by out-of-memory表示記憶體溢出導緻程序關閉 然後走到确認重新開機程序 如果确認重新開機的話又變成running運作狀态 如果不重新開機的話會變成stopped狀态 而stopped狀态可以直接使用docker rm 直接删除

進入運作狀态

killed by out-of-memory表示記憶體溢出導緻程序關閉 然後走到确認重新開機程序 如果确認重新開機的話又變成running運作狀态 如果不重新開機的話會變成stopped狀态 而stopped狀态可以直接使用docker rm 直接删除

而docker create則是建立完不使用,進入created狀态,這個狀态可以使用docker rm 直接删除,或者使用docker start啟動

繼續閱讀