關於OverlayFS的鏡像分層與共享,先說幾個重要的結論
1.overlay驅動只能工作在兩層之上。也就是說多層鏡像不能用多層OverlayFS實現。替代的,每個鏡像層在/var/lib/docker/overlay中用自己的目錄來實現,使用硬鏈接這種有效利用空間的方法,來引用底層分享的數據。注意:Docker1.10之后,鏡像層ID和/var/lib/docker中的目錄名不再一一對應。
2.overlay驅動只工作在一個lower OverlayFS層之上,因此需要硬鏈接來實現多層鏡像
$ mount | grep overlay overlay on /var/lib/docker/overlay/ec444863a55a.../merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay/55f1e14c361b.../root, upperdir=/var/lib/docker/overlay/ec444863a55a.../upper, workdir=/var/lib/docker/overlay/ec444863a55a.../work)
3.但overlay2驅動原生地支持多層lower OverlayFS鏡像(最多128層)
$ mount | grep overlay overlay on /var/lib/docker/overlay2/9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/merged type overlay (rw,relatime, lowerdir=l/DJA75GUWHWG7EWICFYX54FIOVT:l/B3WWEFKBG3PLLV737KZFIASSW7:l/JEYMODZYFCZFYSDABYXD5MF6YO:l/UL2MW33MSE3Q5VYIKBRN4ZAGQP:l/NFYKDW6APBCCUCTOUSYDH4DXAT:l/6Y5IM2XC7TSNIJZZFLJCS6I4I4, upperdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/diff, workdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/work)
4.本質區別是鏡像層之間共享數據的方法不同
overlay共享數據方式是通過硬連接
而overlay2是通過每層的 lower文件
5.overlay2中link
文件描述了該層標識符的精簡版,在overlay2每層的內容都是不一樣的,diff是文件系統的統一掛載點,link文件描述的是該層的標識符,lower文件描述了層與層之間的組織關系,overlay2是將底層多個lowerdir和upperdir和workdir聯合掛載,形成最終的merged掛載點。
6.overlay2為什么比overlay不消耗inode,根本原因在於那些文件夾,每層的root目錄內存放的都是完整的rootfs文件夾,但它們都是新建出來
的,它們inode都不一樣,所以在overlay下一個容器鏡像層數越多,占用的inode就越多 參考:https://www.bladewan.com/2018/01/25/docker_storage_driver/
參考:
https://arkingc.github.io/2017/05/05/2017-05-05-docker-filesystem-overlay/
https://blog.csdn.net/styshoo/article/details/60715942
https://www.cnblogs.com/iiiiher/p/8037719.html
https://zhuanlan.zhihu.com/p/41958018
https://www.cnblogs.com/elnino/p/11015076.html
https://www.bbsmax.com/A/obzb0ND65E/