1. 程式人生 > >docker容器和虛擬機器區別

docker容器和虛擬機器區別

譯者按: 各種虛擬機器技術開啟了雲端計算時代;而Docker,作為下一代虛擬化技術,正在改變我們開發、測試、部署應用的方式。那虛擬機器Docker究竟有何不同呢?

首先,大家需要明確一點,Docker容器不是虛擬機器

2014年,當我第一次接觸Docker的時候,我把它比做一種輕量級的虛擬機器。這樣做無可厚非,因為Docker最初的成功祕訣,正是它比虛擬機器更節省記憶體,啟動更快。Docker不停地給大家宣傳,”虛擬機器需要數分鐘啟動,而Docker容器只需要50毫秒”。

然而,Docker容器並非虛擬機器,我們不妨來比較一下它們。

理解虛擬機器

使用虛擬機器執行多個相互隔離的應用時,如下圖:

<img src="https://pic4.zhimg.com/50/v2-ee27d299f5e38ed460218ac087518bba_hd.jpg" data-rawwidth="566" data-rawheight="707" class="origin_image zh-lightbox-thumb" width="566" data-original="https://pic4.zhimg.com/v2-ee27d299f5e38ed460218ac087518bba_r.jpg">

從下到上理解上圖:

  • 基礎設施(Infrastructure)。它可以是你的個人電腦,資料中心的伺服器,或者是雲主機
  • 虛擬機器管理系統(Hypervisor)。利用Hypervisor,可以在主作業系統之上執行多個不同的從作業系統。型別1的Hypervisor有支援MacOS的HyperKit,支援Windows的Hyper-V、Xen以及KVM。型別2的Hypervisor有VirtualBox和VMWare workstation。
  • 客戶機作業系統(Guest Operating System)。假設你需要執行3個相互隔離的應用,則需要使用Hypervisor啟動3個客戶機作業系統,也就是3個虛擬機器
    。這些虛擬機器都非常大,也許有700MB,這就意味著它們將佔用2.1GB的磁碟空間。更糟糕的是,它們還會消耗很多CPU和記憶體。
  • 各種依賴。每一個客戶機作業系統都需要安裝許多依賴。如果你的應用需要連線PostgreSQL的話,則需要安裝libpq-dev;如果你使用Ruby的話,應該需要安裝gems;如果使用其他程式語言,比如Python或者Node.js,都會需要安裝對應的依賴庫。
  • 應用。安裝依賴之後,就可以在各個客戶機作業系統分別執行應用了,這樣各個應用就是相互隔離的。

理解Docker容器

使用Docker容器執行多個相互隔離的應用時,如下圖:


不難發現,相比於虛擬機器Docker要簡潔很多。因為我們不需要執行一個臃腫的客戶機作業系統

了。

從下到上理解上圖:

  • 基礎設施(Infrastructure)
  • 主作業系統(Host Operating System)。所有主流的Linux發行版都可以執行Docker。對於MacOS和Windows,也有一些辦法”執行”Docker。
  • Docker守護程序(Docker Daemon)。Docker守護程序取代了Hypervisor,它是執行在作業系統之上的後臺程序,負責管理Docker容器。
  • 各種依賴。對於Docker,應用的所有依賴都打包在Docker映象中,Docker容器是基於Docker映象建立的。
  • 應用。應用的原始碼與它的依賴都打包在Docker映象中,不同的應用需要不同的Docker映象。不同的應用執行在不同的Docker容器中,它們是相互隔離的。

對比虛擬機器與Docker

Docker守護程序可以直接與主作業系統進行通訊,為各個Docker容器分配資源;它還可以將容器與主作業系統隔離,並將各個容器互相隔離。虛擬機器啟動需要數分鐘,而Docker容器可以在數毫秒內啟動。由於沒有臃腫的從作業系統,Docker可以節省大量的磁碟空間以及其他系統資源。

說了這麼多Docker的優勢,大家也沒有必要完全否定虛擬機器技術,因為兩者有不同的使用場景。虛擬機器更擅長於徹底隔離整個執行環境。例如,雲服務提供商通常採用虛擬機器技術隔離不同的使用者。而Docker通常用於隔離不同的應用,例如前端後端以及資料庫

伺服器虛擬化 vs Docker

伺服器好比運輸碼頭:擁有場地和各種裝置(伺服器硬體資源)

伺服器虛擬化好比作碼頭上的倉庫:擁有獨立的空間堆放各種貨物或集裝箱

(倉庫之間完全獨立,獨立的應用系統和作業系統)

Docker比作集裝箱:各種貨物的打包

(將各種應用程式和他們所依賴的執行環境打包成標準的容器,容器之間隔離)

Docker有著小巧、遷移部署快速、執行高效等特點,但隔離性比伺服器虛擬化差:不同的集裝箱屬於不同的運單(Docker上執行不同的應用例項),相互獨立(隔離)。但由同一個庫管人員管理(主機作業系統核心),因此通過庫管人員可以看到所有集裝箱的相關資訊(因為共享作業系統核心,因此相關資訊會共享)。

伺服器虛擬化就好比在碼頭上(物理主機及虛擬化層),建立了多個獨立的“小碼頭”—倉庫(虛擬機器)。其擁有完全獨立(隔離)的空間,屬於不同的客戶(虛擬機器所有者)。每個倉庫有各自的庫管人員(當前虛擬機器的作業系統核心),無法管理其它倉庫。不存在資訊共享的情況

因此,我們需要根據不同的應用場景和需求採用不同的方式使用Docker技術或使用伺服器虛擬化技術。例如一個典型的Docker應用場景是當主機上的Docker例項屬於單一使用者的情況下,在保證安全的同時可以充分發揮Docker的技術優勢。對於隔離要求較高的環境如混合使用者環境,就可以使用伺服器虛擬化技術。正則科技提供了豐富的Docker應用例項,滿足您的各種應用需求,並且支援在已經安裝了自在(Isvara)伺服器虛擬化軟體的主機上同時使用伺服器虛擬化技術和Docker技術提供不同技術場景。

轉載:https://www.zhihu.com/question/48174633

<img src="https://pic3.zhimg.com/50/v2-70c4490203c166b6a2e8a156d1b259ce_hd.jpg" data-rawwidth="610" data-rawheight="393" class="origin_image zh-lightbox-thumb" width="610" data-original="https://pic3.zhimg.com/v2-70c4490203c166b6a2e8a156d1b259ce_r.jpg">

參考文獻:Comparing Virtual Machines vs Docker Containers

中文譯者:Fundebug