容器的本質是一種特殊的進程。linux
在linux容器中有三個重要的概念:Namespace、Cgroups、rootfs。docker
Namespace作隔離,讓進程只能看到Namespace中的世界;spa
Cgroups 作限制,讓這個「世界」圍着一個看不見的牆。操作系統
rootfs 作文件系統,rootfs 只是一個操做系統所包含的文件、配置和目錄,並不包括操做系統內核。blog
這樣就實現了進程在咱們所看到的一個與世隔絕的房間,這個房間就是Pass項目賴以生存的"沙盒"。進程
進入容器後,ps命令看到的容器的應用進程都是1號進程,這個實際上是pid namespace致使,他其實就是個障眼法,虛擬機
讓你看到的是相似於一個新的虛擬機新環境,實際上是不同的,容器就是一個運行的進程,而容器中的其餘進程則是pid爲1的子進程。it
除了剛剛pid namespace,還有其它的namespace以下:容器
容器是怎麼新建namespace的?配置
docker建立容器,其實就是linux系統的一次fork的調用,
在進行fork調用時,會傳入一些flag參數,這個參數能夠控制對linux內核調用新的namespace。
掛載在容器根目錄上、用來爲容器進程提供隔離後執行環境的文件系統,就是所謂的「容器鏡像」。它還有一個更爲專業的名字,叫做:rootfs(根文件系統)。
容器的rootfs由三部分組成,1:只讀層、2:可讀寫層、3:init層
1.只讀層:都以增量的方式分別包含了 操做系統的一部分。
2.可讀寫:就是專門用來存放你修改 rootfs 後產生的增量,不管是增、刪、改,都發生在這裏。而當咱們使用完了這個被修改過的容器以後,還能夠使用 docker commit 和 push 指令,保存這個被修改過的可讀寫層,並上傳到 Docker Hub 上,供其餘人使用;而與此同時,原先的只讀層裏的內容則不會有任何變化。這,就是增量 rootfs 的好處。
3.Init 層:是 Docker 項目單獨生成的一個內部層,專門用來存放 /etc/hosts、/etc/resolv.conf 等信息。