轉自:https://zhuanlan.zhihu.com/p/22382728html
https://zhuanlan.zhihu.com/p/22403015linux
在學習docker的過程當中,我發現目前docker學習最大的障礙,不是網上的資源太少,而是網上的資源太多,資源太多帶來的噪聲讓學習效率下降很多。而在講解docker原理上,全部的講解都是關於cgroups,namespace,aufs以及deviceMapper,這對於一個初學者來講,就是用一堆名詞替換另外一堆名詞,因此我打算寫一篇不涉及太多api的原理解析,在這篇解析中,將不會討論:android
在開始討論前,先拋出一些問題,可先別急着查看答案,討論的過程可讓答案更有趣,問題以下:docker
先來理解一下虛擬機概念,廣義來講,虛擬機是一種模擬系統,即在軟件層面上經過模擬硬件的輸入和輸出,讓虛擬機的操做系統得以運行在沒有物理硬件的環境中(也就是宿主機的操做系統上),其中可以模擬出硬件輸入輸出,讓虛擬機的操做系統能夠啓動起來的程序,被叫作hypervisor。用一張圖來講明這個關係就是:ubuntu
在這張圖中:windows
好比,舉一個你們都很熟悉的例子,在編寫android程序時,調試和測試運行均可以在X86架構的臺式機或筆記本進行,這就是一個典型的虛擬機例子,在這之中:api
固然android模擬機一個大問題就是:啓動速度很是慢,最長可達10分鐘或以上,這是由於單純模擬硬件的輸入輸出,效率是不好的,因此這樣的虛擬機若是真部署在服務器上,速度是感人的。服務器
這個時候,就有計算機科學家提出了很是偷懶的想法:假如咱們不模擬硬件輸入輸出,只是作下真實硬件輸入輸出的搬運工,那麼虛擬機的指令執行速度,就能夠和宿主機一致了。固然這前提是宿主機的硬件架構必須和虛擬硬件架構一致。好比,網絡
因爲本篇並非主要關於虛擬機的內容,因此這些點就點到而止,更多詳細內容能夠參閱:Hypervisor架構
通常來講,虛擬機都會有本身的kernel,本身的硬件,這樣虛擬機啓動的時候須要先作開機自檢,啓動kernel,啓動用戶進程等一系列行爲,雖然如今電腦運行速度挺快,可是這一系列檢查作下來,也要幾十秒,也就是虛擬機須要幾十秒來啓動。
更多關於容器的內容能夠看這份課件:https://courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf
至此就能夠回答引言提到的兩個問題: