Docker技術總結

  1. Docker 的基礎是Linux容器(LXC)等技術。
  2. 在LXC的基礎上Docker進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更爲簡便。
  3. Docker使用Cgroups來提供容器隔離,而union文件系統用於保存鏡像並使容器變得短暫。

容器和虛擬機相比

容器和虛擬機都有資源隔離和分配的優點, 但不同虛擬機運行在不同的操作系統kernal上,而容器之間則是共享kernal,各個容器在宿主機上互相隔離,並在用戶態下運行。這導致虛擬機鏡像一般比容器要打很多,同時虛擬機的啓動速度也比容器更慢。

官網的說法是:虛擬機上的應用不僅包含了應用本身、必要的依賴(二進制和庫包等),還包括整個操作系統;而docker應用不同,共享系統內核,僅僅包含應用本身和依賴。

docker的資源隔離

登錄到docker容器中,只能訪問到本容器中的進程、用戶、網絡設備等。這個技能就是通過linux kernal提供的Namespace實現的。

docker的資源限制

資源限制是指爲不同的容器分配不同配置的資源,比如一臺宿主機上有5個容器,爲了使不同容器能充分使用且只能使用自己屬於自己的資源,就需要進行資源限制。資源限制是通過linux的cgroups實現的。Linux Cgroups(Control Groups)提供了對一組進程及將來子進程的資源限制、控制和統計的能力,這些 資源 包括 CPU、內存、存儲、網絡等。

關於鏡像打包和存儲

每一個docker image 都是由一系列的read only layer組成的。當啓動一個容器的時候,docker會爲其創建一個read only的init layer,用來存儲容器內環境相關的內容,除此之外,docker還會爲其創建一個read write layer來執行所有的寫操作。如果寫操作影響到鏡像文件,docker會把受到影響的文件複製一份再進行寫操作。這個技能則是通過linux提供的AUFS實現的。AUFS起源於UnionFS,通過它可以把多個文件系統聯合到一個掛載點。它使用branch把不同文件的文件和目錄透明地覆蓋,形成一個單一一致的文件系統。這些branch或者是read-only的,或者是read-write的,所以當對這個虛擬後的聯合文件系統進行寫操作的時候,系統是真正寫到了一個新的文件中。看起來這個虛擬後的聯合文件系統是可以對任何文件進行操作 的,但是其實它並沒有改變原來的文件,這是因爲unionfs用到了一個重要的資源管理技術,叫寫時複製。它的 思想是,如果一個資源是重複的,但沒有任何修改,這時並不需要立即創建一個新的資源,這個資源可以被新舊 實例共享。創建新資源發生在第一次寫操作,也就是對資源進行修改的時候。

Docker運行流程

正如上圖所示,當我們想運行一個容器的時候,docker會:

  1. 拉取鏡像,若本地已經存在該鏡像,則不用到網上去拉取
  2. 創建新的容器
  3. 分配union文件系統並且掛着一個可讀寫的層,任何修改容器的操作都會被記錄在這個讀寫層上,你可以保存這些修改成新的鏡像,也可以選擇不保存,那麼下次運行改鏡像的時候所有修改操作都會被消除
  4. 分配網絡\橋接接口,創建一個允許容器與本地主機通信的網絡接口
  5. 設置ip地址,從池中尋找一個可用的ip地址附加到容器上,換句話說,localhost並不能訪問到容器
  6. 運行你指定的程序
  7. 捕獲並且提供應用輸出,包括輸入、輸出、報錯信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章