docker既可以運行在物理機上也可以運行在虛擬機上;無論是虛擬機還是物理機,都是硬件和基礎設施的一種交付方式,本質上是一個層次的,而容器主要用于解決以軟件為中心的系列問題,在虛擬機和物理機運行容器都是可行的。
本教程操作環境:linux7.3系統、docker19.03版、Dell G3電腦。
docker運行在物理機還是虛擬機上
docker容器運行在虛擬機或者物理機上都可以
無論是虛擬機還是物理機,都是硬件/基礎設施的一種交付方式,本質上是一個層次的;而容器主要要解決以軟件為中心的系列問題
嚴格來講,容器和虛擬機并不是一個層次的東西,它就是軟件+環境的打包集合。
在虛擬機中運行容器,已經成為一種實踐中的慣例,比如,AWS的container服務就是只運行在虛擬機中的。
Docker守護進程可以直接與主操作系統進行通信,為各個Docker容器分配資源;它還可以將容器與主操作系統隔離,并將各個容器互相隔離。Docker通常用于隔離不同的應用,例如前端,后端以及數據庫。
擴展知識:
Docker守護進程可以直接與主操作系統進行通信,為各個Docker容器分配資源;它還可以將容器與主操作系統隔離,并將各個容器互相隔離。Docker通常用于隔離不同的應用,例如前端,后端以及數據庫。
Docker有著小巧、遷移部署快速、運行高效等特點,但隔離性比服務器虛擬化差:不同的集裝箱屬于不同的運單(Docker上運行不同的應用實例),相互獨立(隔離)。但由同一個庫管人員管理(主機操作系統內核),因此通過庫管人員可以看到所有集裝箱的相關信息(因為共享操作系統內核,因此相關信息會共享)。
虛擬機更擅長于徹底隔離整個運行環境。例如,云服務商通常采用虛擬機技術隔離不同的用戶。虛擬機啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由于沒有臃腫的操作系統,Docker可以節省大量的磁盤空間以及其他系統資源。
服務器虛擬化就好比在碼頭上(物理主機及虛擬化層),建立了多個獨立的“小碼頭”—倉庫(虛擬機)。其擁有完全獨立(隔離)的空間,屬于不同的客戶(虛擬機所有者)。每個倉庫有各自的庫管人員(當前虛擬機的操作系統內核),無法管理其它倉庫。不存在信息共享的情況。
因此,我們需要根據不同的應用場景和需求采用不同的方式,使用Docker技術或使用服務器虛擬化技術。
docker與虛擬機實現原理比較
如下圖分別是虛擬機與docker的實現框架。
比較兩圖的差異,左圖虛擬機的Guest OS層和Hypervisor層在docker中被Docker Engine層所替代。虛擬機的Guest OS即為虛擬機安裝的操作系統,它是一個完整操作系統內核;虛擬機的Hypervisor層可以簡單理解為一個硬件虛擬化平臺,它在Host OS是以內核態的驅動存在的。
虛擬機實現資源隔離的方法是利用獨立的OS,并利用Hypervisor虛擬化CPU、內存、IO設備等實現的。例如,為了虛擬CPU,Hypervisor會為每個虛擬的CPU創建一個數據結構,模擬CPU的全部寄存器的值,在適當的時候跟蹤并修改這些值。需要指出的是在大多數情況下,虛擬機軟件代碼是直接跑在硬件上的,而不需要Hypervisor介入。只有在一些權限高的請求下,Guest OS需要運行內核態修改CPU的寄存器數據,Hypervisor會介入,修改并維護虛擬的CPU狀態。
Hypervisor虛擬化內存的方法是創建一個shadow page table。正常的情況下,一個page table可以用來實現從虛擬內存到物理內存的翻譯。在虛擬化的情況下,由于所謂的物理內存仍然是虛擬的,因此shadow page table就要做到:虛擬內存->虛擬的物理內存->真正的物理內存。
對于IO設備虛擬化,當Hypervisor接到page fault,并發現實際上虛擬的物理內存地址對應的是一個I/O設備,Hypervisor就用軟件模擬這個設備的工作情況,并返回。比如當CPU想要寫磁盤時,Hypervisor就把相應的數據寫到一個host OS的文件上,這個文件實際上就模擬了虛擬的磁盤。
對比虛擬機實現資源和環境隔離的方案,docker就顯得簡練很多。docker Engine可以簡單看成對Linux的Namespace、Cgroup、鏡像管理文件系統操作的封裝。docker并沒有和虛擬機一樣利用一個完全獨立的Guest OS實現環境隔離,它利用的是目前linux內核本身支持的容器方式實現資源和環境隔離。簡單的說,docker利用namespace實現系統環境的隔離;利用Cgroup實現資源限制;利用鏡像實現根目錄環境的隔離。
推薦學習:《docker視頻教程》