前言
1: 只知道虛擬機會對硬件進行虛擬化,容器使用的硬件資源還是宿主機的
正文
1: 對 Docker 項目來說,它最核心的原理實際上就是爲待創建的用戶進程: 啓用 Linux Namespace 配置; 設置指定的 Cgroups 參數; 切換進程的根目錄(Change Root)。
2: 實際上,同一臺機器上的所有容器,都共享宿主機操作系統的內核。
這就意味着,如果你的應用程序需要配置內核參數、加載額外的內核模塊,以及跟內核進行直接的交互,你就需要注意了:這些操作和依賴的對象,都是宿主機操作系統的內核,它對於該機器上的所有容器來說是一個“全局變量”,牽一髮而動全身。
這也是容器相比於虛擬機的主要缺陷之一:畢竟後者不僅有模擬出來的硬件機器充當沙盒,而且每個沙盒裏還運行着一個完整系統。
3:容器鏡像,也叫作:rootfs。它只是一個操作系統的所有文件和目錄,並不包含內核,它和mount namespace協助構建出獨立的文件系統。
而這個掛載在容器根目錄上、用來爲容器進程提供隔離後執行環境的文件系統,就是所謂的“容器鏡像”。它還有一個更爲專業的名字,叫作:rootfs(根文件系統)。
所以,一個最常見的 rootfs,或者說容器鏡像,會包括如下所示的一些目錄和文件,比如 /bin,/etc,/proc 等等:
所以說,rootfs 只包括了操作系統的“軀殼”,並沒有包括操作系統的“靈魂”。
靈魂就是操作系統的內核!所有的容器都共享着宿主機的內核,所以容器對內核的修改會牽一髮而動全身。
4:
Docker 在鏡像的設計中,引入了層(layer)的概念。也就是說,用戶製作鏡像的每一步操作,都會生成一個層,也就是一個增量 rootfs。
所謂的“鏡像”,實際上就是一個 Ubuntu 操作系統的 rootfs,它的內容是 Ubuntu 操作系統的所有文件和目錄。不過,與之前我們講述的 rootfs 稍微不同的是,Docker 鏡像使用的 rootfs,往往由多個“層”組成。