1. 程式人生 > >docker簡介、虛擬機器與Docker有何不同

docker簡介、虛擬機器與Docker有何不同

為什麼越來越多人使用docker

那麼,為什麼大家都追捧容器和Docker呢?Hyper-V、KVM和Xen等虛擬機器管理程式都“基於虛擬化硬體模擬機制。這意味著,它們對系統要求很高。”
然而,容器卻使用共享的作業系統。這意味著它們在使用系統資源方面比虛擬機器管理程式要高效得多。容器不是對硬體進行虛擬化處理,而是駐留在單單一個Linux例項上。這反過來意味著,你可以“丟棄沒有用的99.9%的虛擬機器垃圾,剩下一個小巧簡潔的膠囊式容器,裡面含有你的應用程式,”
是不是覺得聽起來很不錯?畢竟,你可以讓伺服器執行多得多的應用程式。那麼,為什麼之前沒有人做過呢?實際上,之前有人做過。容器其實是個舊概念。
容器可以追溯到至少2000年和FreeBSD Jails。甲骨文Solaris也有一個類似概念,名為Zones;Parallels、谷歌和Docker等公司一直在致力於研發諸如OpenVZ和LXC(Linux容器)之類的開源專案,旨在讓容器執行起來順暢又安全。
的確,很少有人知道容器,但大多數人多年來一直在使用容器。谷歌就有自己的開源容器技術lmctfy(Let Me Contain That For You,意為“讓我容納你的程式”)。只要你使用谷歌的某項功能:比如搜尋、Gmail、Google Docks或無論其他什麼,就分配了一個新的容器。
然而,Docker建立在LXC的基礎上。與任何容器技術一樣,就該程式而言,它有自己的檔案系統、儲存系統、處理器和記憶體等部件。容器與虛擬機器之間的區別主要在於,虛擬機器管理程式對整個裝置進行抽象處理,而容器只是對作業系統核心進行抽象處理


這反過來意味著:虛擬機器管理程式能做容器做不了的一件事就是,使用不同的作業系統或核心。所以,舉例說,你可以使用微軟Azure,同時執行Windows Server2012的例項和SUSE Linux企業級伺服器的例項。至於Docker,所有容器都必須使用同樣的作業系統和核心。
另一方面,如果你只是想讓儘可能多的伺服器應用例項在儘可能少的硬體上執行,可能不大關心執行多個作業系統虛擬機器。要是同一應用程式的多個副本正是你需要的,那麼你會喜歡上容器。
改用Docker這一舉措有望每年為資料中心或雲端計算服務提供商節省數千萬美元的電力和硬體成本。所以難怪它們在一窩蜂地儘快採用Docker。
Docker帶來了之前技術所沒有的幾個新特點。第一是,與之前的方法相比,Docker讓容器部署和使用起來更容易、更安全。此外,由於Docker與其他容器領域的巨擘進行了合作,包括Canonical、谷歌、紅帽和Parallels,共同開發其關鍵的開源元件libcontainer,它為容器帶來了迫切需要的標準化。
與此同時,廣大開發人員可以使用Docker封裝、交付和執行任何應用程式,應用程式成為輕型的、可移植的、自給自足的LXC容器,可以在任何地方執行。“容器讓你立即享有應用程式可移植性。”
最後但並非最不重要的,Docker容器易於部署到雲端。“Docker採用了一種特別的方式,以便可以整合到大多數DevOps(開發運營)應用程式當中,包括Puppet、Chef、Vagrant和Ansible,或者可以獨自使用,以管理開發環境。主要賣點是,它簡化了通常由另外這些應用程式執行的好多工。具體來說,有了Docker,人們就可以搭建與活動伺服器一模一樣的本地開發環境,從同一個主機執行多個開發環境(每個開發環境有獨特的軟體、作業系統和配置),在新的或不同的伺服器上測試專案,以及讓任何人都可以在設定一模一樣的情況下處理同一專案,無論本地主機環境怎樣。”
簡而言之,Docker能為你做的事情就是:相比其他技術,它能讓更多數量的應用程式在同一硬體上執行;它讓開發人員易於快速構建可隨時執行的容器化應用程式;它大大簡化了管理和部署應用程式的任務。

把它比做一種輕量級的虛擬機器。這樣做無可厚非,因為Docker最初的成功祕訣,正是它比虛擬機器更節省記憶體,啟動更快。Docker不停地給大家宣傳,”虛擬機器需要數分鐘啟動,而Docker容器只需要50毫秒”。
然而,Docker容器並非虛擬機器,我們不妨來比較一下它們。

理解虛擬機器

使用虛擬機器執行多個相互隔離的應用時,如下圖:
這裡寫圖片描述
從下到上理解上圖:

  • 基礎設施(Infrastructure)。它可以是你的個人電腦,資料中心的伺服器,或者是雲主機。
  • 主作業系統(Host Operating System)。你的個人電腦之上,執行的可能是MacOS,Windows或者某個Linux發行版。
  • 虛擬機器管理系統(Hypervisor)。利用Hypervisor,可以在主作業系統之上執行多個不同的從作業系統。型別1的Hypervisor有支援MacOS的HyperKit,支援Windows的Hyper-V以及支援Linux的KVM。型別2的Hypervisor有VirtualBox和VMWare。
  • 從作業系統(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通常用於隔離不同的應用,例如前端,後端以及資料庫。

如果你對Docker感興趣的話,不妨學習一下Dive Into Docker course。

原文: Comparing Virtual Machines vs Docker Containers