1.Docker鏡像git
1.1相關概念:registry :用於保存Docker鏡像,包括鏡像層次結構和鏡像元數據,相似於git倉庫之類的實體。算法
repository:某個Docker鏡像全部迭代版本的構成的鏡像組。registry是repository的合集,repository是鏡像的合集。docker
manifest:存在於registry中做爲Docker鏡像的元數據文件。鏡像被pull到宿主機時,自動轉化爲本地的鏡像配置文件。json
image / layer:docker內部的image概念是用來存儲一組鏡像相關的元數據,包括鏡像架構,默認配置等,包含全部鏡像層信息的rootfs。layer是Docker用來管理鏡像層的中間概念,由於單個鏡像層可能被多個鏡像使用,因此docker把layer和image的概念分開,layer存放了鏡像層的diff_id,size,parent_id等內容。api
Dockerfile:構建鏡像時用到的定義文件。架構
1.2相關操做:build / pull / push / save / export / loadapp
1.3鏡像存儲管理:Docker鏡像設計上將鏡像元數據和鏡像文件的存儲徹底分開,Docker在管理鏡像層元數據時採用的是從上至下repository,image,layer三個層次。由於docker以分層的形式存儲鏡像,所以repository和image這兩類元數據沒有物理上的鏡像文件與之對應,而layer則存在物理上的鏡像文件與之對應。ui
repository元數據:位置->/var/lib/docker/image/aufs(graph_driver)/repositories.json,存儲了全部repository的名字,tag和對應的鏡像IDurl
image元數據:位置->/var/lib/docker/image/aufs/imagedb/content/sha256/鏡像ID,各類鏡像相關信息spa
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爲名的文件夾在容器被刪除時也會對應的被刪除。