背景
整理一下前一陣子對docker的學習筆記
概述
Docker負責管理鏡像和容器,是一種輕量級的虛擬機。
鏡像與容器
鏡像和容器的關係就相當於類和實例的關係,容器相當於運行在虛擬機上的操作系統,鏡像則相當於鏡像文件。
Docker執行run命令時,先在本地查詢鏡像,本機查不到就到hub上去下載,然後以此鏡像爲模板生產容器實例運行。如下圖所示
Docker和虛擬機的區別
1、Docker的抽象層比虛擬機少,沒有硬件資源虛擬化,運行在容器上的程序直接使用物理機的硬件資源,故而效率更高。
2、Docker利用物理機的內核,而不是Guest OS,所以新建容器時,Docker不必重新加載一個操作系統內核,直接利用物理機的即可。
兩者區別如下圖所示(左圖左邊爲虛擬機架構,右邊爲Docker架構):
聯合文件系統
這是一種分層、輕量級並且高性能的文件系統。支持對文件系統的修改作爲一次提交來一層層的疊加。
特性:一次加載多個文件系統,但從外面來看只有一個文件系統。聯合加載會把各層文件系統疊加起來,高層文件系統會包含所有底層文件系統的目錄和文件,這樣最終的文件系統會包含所有底層的文件和目錄。
聯合文件系統是Docker鏡像的基礎。
Docker鏡像加載原理
Docker鏡像實際上由一層層文件系統組成,也就是上面的聯合文件系統。
最底層的bootfs主要包含bootloader和kernel,bootloader主要負責引導加載kernel。容器啓動完成後,內核全部在內存中,系統會卸載bootfs。
第二層的rootfs則爲各種OS的發行版,裏面包含各種典型的linux系統目錄,如/dev、/bin、/etc等。
對於一個精簡的OS,rootfs只需要包含最基本的命令、工具和程序庫,因爲底層直接使用宿主機的kernel,所以不同的inux可以使用公用的bootfs。因此docker中的系統鏡像都比較小。
這樣做的好處就是共享資源:只加載一個鏡像,就可以被所有容器使用,鏡像的每一層都可以被共享