Docker學習總結(二)—— 鏡像,容器


1.Docker鏡像

 1.1相關概念:registry :用於保存Docker鏡像,包括鏡像層次結構和鏡像元數據,類似於git倉庫之類的實體。

                   repository:某個Docker鏡像所有迭代版本的構成的鏡像組。registry是repository的合集,repository是鏡像的合集。

                   manifest:存在於registry中作為Docker鏡像的元數據文件。鏡像被pull到宿主機時,自動轉化為本地的鏡像配置文件。

                   image / layer:docker內部的image概念是用來存儲一組鏡像相關的元數據,包括鏡像架構,默認配置等,包含所有鏡像層信息的rootfs。layer是Docker用來管理鏡像層的中間概念,因為單個鏡像層可能被多個鏡像使用,所以docker把layer和image的概念分開,layer存放了鏡像層的diff_id,size,parent_id等內容。

                   Dockerfile:構建鏡像時用到的定義文件。

 1.2相關操作:build / pull / push / save / export / load

 1.3鏡像存儲管理:Docker鏡像設計上將鏡像元數據和鏡像文件的存儲完全分開,Docker在管理鏡像層元數據時采用的是從上至下repository,image,layer三個層次。因為docker以分層的形式存儲鏡像,因此repository和image這兩類元數據沒有物理上的鏡像文件與之對應,而layer則存在物理上的鏡像文件與之對應。

    repository元數據:位置->/var/lib/docker/image/aufs(graph_driver)/repositories.json,存儲了所有repository的名字,tag和對應的鏡像ID

    

    image元數據:位置->/var/lib/docker/image/aufs/imagedb/content/sha256/鏡像ID,各種鏡像相關信息

    

    layer元數據: 位置->/var/lib/docker/image/aufs/layerdb/sha256,包括diff_id,parent,size等信息,其中diffid是通過鏡像層內容用sha256算法計算得來。layerdb目錄下還有一個mount目錄,用於存儲容器可讀寫層的相關信息。

    

  1.4鏡像實際文件存放:

    docker的鏡像管理和存儲是完全隔離的,以aufs為例,進入/var/lib/docker下有三個文件夾,分別為diff/,layers/,mnt/。其中mnt為aufs的掛載目錄,diff為實際的數據來源,包括只讀層和可讀寫層,layers存放層依賴有關的層描述文件。mnt和layers最初都是空目錄,文件數據在diff下,但隨后創建容器時mnt和layers目錄會慢慢更新。

    容器創建過程中的層存儲變化:容器創建時會隨機生成容器讀寫層的mountID,並保存在image/aufs/layerdb/mounts/容器id/目錄下 ->

                在mnt和diff目錄下創建以該容器層的mountID同名的子文件夾 ->

                在layers目錄下創建文件來記錄該層依賴的其他鏡像層 ->

                GraphDriver將diff中容器依賴的所有鏡像層目錄掛載到mnt目錄下,並會生成一個對應當前容器的以mountID-init格式命名的文件夾作為容器的最后一個只讀層 ->  

                diff目錄下的mountID命名的子目錄作為容器的可讀寫層,也掛載到mnt目錄下。

    docker容器設計了mountID-init這一層來記錄容器啟動時根據系統環境和用戶配置自動生成的內容,一般情況下,容器commit操作保存的鏡像不會包含這一層內容。嚴格意義上來講容器的文件系統有三層:可讀寫層 / init層 / 只讀層。

    docker ps -a即可看到容器短id,然后根據這個短id去  var/lib/docker/image/aufs/layerdb/mounts/短id.../ 這個路徑下可以查看當前容器的init-id mount-id等。容器未啟動時,在對應的mnt目錄下的mountID文件夾(/var/lib/docker/aufs/mnt/[mountID]/)是空的,容器啟動后,可以看到這個文件夾下掛載了對應的系統文件(/bin /home /proc等等)。如果用戶在容器中對容器進行一些操作,這些操作都會被記錄在這個文件夾中,當容器被停止時,mnt下對應的mountID目錄被卸載,但diff下對應的mountID文件夾還存在,但只限於宿主機。因此如果我們用docker commit把容器提交成鏡像時其實就是在diff目錄下生成一個新的cacheID命名的文件夾存放最新的差異變化,這樣一個新的鏡像層就產生了,而原來的diff下以mountID為名的文件夾在容器被刪除時也會對應的被刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM