0 引言
在學習docker的過程當中,我發現目前docker學習最大的障礙,不是網上的資源太少,而是網上的資源太多,資源太多帶來的噪聲讓學習效率下降很多。而在講解docker原理上,全部的講解都是關於cgroups,namespace,aufs以及deviceMapper,這對於一個初學者來講,就是用一堆名詞替換另外一堆名詞,因此我打算寫一篇不涉及太多api的原理解析,在這篇解析中,將不會討論:linux
- 一堆堆砌在一塊兒的專有名詞,讓閱讀者雲裏霧裏
- 一大堆寫滿了專有名詞的圖,可是不給太多解釋
這篇解析將會涉及:android
- 虛擬機的實現原理
- 虛擬機和容器的區別
在開始討論前,先拋出一些問題,可先別急着查看答案,討論的過程可讓答案更有趣,問題以下:docker
1 虛擬機
先來理解一下虛擬機概念,廣義來講,虛擬機是一種模擬系統,即在軟件層面上經過模擬硬件的輸入和輸出,讓虛擬機的操做系統得以運行在沒有物理硬件的環境中(也就是宿主機的操做系統上),其中可以模擬出硬件輸入輸出,讓虛擬機的操做系統能夠啓動起來的程序,被叫作hypervisor。用一張圖來講明這個關係就是:windows
在這張圖中:api
- 物理機被稱爲宿主機
- 虛擬機也被稱爲guest OS
- 而被hypervisor虛擬出來的硬件被稱爲虛擬硬件
好比,舉一個你們都很熟悉的例子,在編寫android程序時,調試和測試運行均可以在X86架構的臺式機或筆記本進行,這就是一個典型的虛擬機例子,在這之中:服務器
- 宿主機就是臺式機或筆記本
- 虛擬機就是虛擬出來的android
- 而模擬android的軟件就是android box
固然android模擬機一個大問題就是:啓動速度很是慢,最長可達10分鐘或以上,這是由於單純模擬硬件的輸入輸出,效率是不好的,因此這樣的虛擬機若是真部署在服務器上,速度是感人的。架構
這個時候,就有計算機科學家提出了很是偷懶的想法:假如咱們不模擬硬件輸入輸出,只是作下真實硬件輸入輸出的搬運工,那麼虛擬機的指令執行速度,就能夠和宿主機一致了。固然這前提是宿主機的硬件架構必須和虛擬硬件架構一致。好比,app
- 咱們能夠在linux的臺式機上輕鬆模擬windows,並且這個windows的運行速度基本上和原生裝一個windows速度差很少,由於windows也能被直接安裝在這臺臺式機上。
- 這個思路對於在windows系統中運行android系統無論用,由於android系統的運行硬件通常是手機(arm系統,能夠理解爲不一樣的硬件架構體系和cpu指令集),因此android模擬機仍是同樣的慢。
因爲本篇並非主要關於虛擬機的內容,因此這些點就點到而止,更多詳細內容能夠參閱:Hypervisor學習
2 容器的概念
通常來講,虛擬機都會有本身的kernel,本身的硬件,這樣虛擬機啓動的時候須要先作開機自檢,啓動kernel,啓動用戶進程等一系列行爲,雖然如今電腦運行速度挺快,可是這一系列檢查作下來,也要幾十秒,也就是虛擬機須要幾十秒來啓動。測試
- 從新來理解虛擬機的概念,計算機科學家發現其實咱們建立虛擬機也不必定須要模擬硬件的輸入和輸出,假如宿主機和虛擬機他們的kernel是一致的,就不用作硬件輸入輸出的搬運工了,只須要作kernel輸入輸出的搬運工便可,爲了有別於硬件層面的虛擬機,這種虛擬機被命名爲 操做系統層虛擬化:Operating-system-level virtualization 也被叫作容器
- 讓咱們來回顧虛擬機的概念,在虛擬機的系統中,虛擬機認爲本身有獨立的文件系統,進程系統,內存系統,等等一系列,因此爲了讓容器接近虛擬機,也須要有獨立的文件系統,進程系統,內存系統,等等一系列,爲了達成這一目的,主機系統採用的辦法是:只要隔離容器不讓它看到主機的文件系統,進程系統,內存系統,等等一系列,那麼容器系統就是一個接近虛擬機的玩意了
更多關於容器的內容能夠看這份課件:https://courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf
至此就能夠回答引言提到的兩個問題:
- Docker 容器有本身的kernel嗎
- 沒有,docker和宿主機共享kernel
- docker的kernel version由鏡像肯定仍是由宿主機肯定
- 由宿主機決定
3 how to learn more
- 關於操做系統層的虛擬化的概念:Operating-system-level virtualization 以及包括freebsd jail有關的一系列其餘的操做系統上類似的實現
- 想要了解更多,docker具體作了什麼,能夠參考:一篇不同的docker原理解析 提升篇 - uncle creepy的文章 - 知乎專欄
- 關於namespace,cgroups,aufs,deviceMapper 能夠了解官方文檔
- 在mac os和windows上運行docker的祕密:Boot2docker by boot2docker 就是經過這個叫作boot2docker的玩意啓動了一個虛擬linux kernel,全部的docker容器都跑在這個kernel上