Docker學習總結之Docker與Vagrant之間的特點比較


Docker學習總結之Docker與Vagrant之間的特點比較

 

  以下內容均出自Vagrant作者(Mitchell Hashimoto)與Docker作者(Solomon Hykes)在stackoverflow上面一個問題討論。在這個問題中,雙方闡述了vagrant和docker的特點和使用范圍,對於深入理解vagrant和docker很有意義,因此筆者翻譯出來,以供大家討論學習。

  Mitchell作為vagrant的作者,其在DevOps的世界里面沉浸多年,接觸了很多類似docker的虛擬化軟件。他目前接觸了很多使用vagrant和docker的場景,所以看到了兩者是如何相互搭配發生作用的。

  他認為如果單單是開發人員一個人單獨使用主機,使用docker可以簡化很多事情,這種場景下使用docker和vagrant都沒有什么區別。所以他更多的討論了一些復雜場景,在這些復雜場景中,docker和vagrant就有一些區別了。

  以下是他原文:

  不分場景而直接比對vagrant和docker是不恰當的!在一些簡單場景中,它們兩款產品作用是重復的,但在更多場景中,它們兩款產品無法相互替代。事實上,vagrant抽象度比docker更高,因此直接用vagrant同docker相比較是不恰當的。而把vagrant同Boot2Docker(一款運行docker最小的內核) 進行比較似乎更加恰當。

  vagrant為了支持開發,在啟動虛擬機環境時啟動了很多的應用和服務。vagrant可以在VirtualBox, VMware上面運行(docker無法執行)。vagrant也可以在AWS, OpenStack這些雲環境中運行。即便你使用了docker的容器,vagrant同樣也沒問題。vagrant可以自動install, pull down, build,  run Docker containers。

  比如在vagrant V1.6版本中,vagrant集成了docker-based development environments,因此Vagrant可以在windows,mac和linux上面提供docker服務。

  vagrant沒有想替代docker的想法,相反它還包含了docker的一些特性。

  如果我們從邏輯層面來比較vagrant和docker的話,那么:

  1、docker只能執行docker所定義的容器。

  2、docker缺乏靈活的隔離方案(docker只能運行在Linux主機環境中)。

  如果我們從Production和CI層面來比較,那么docker就無法與vagrant相比了:Vagrant沒有上面的約束條件,而docker必須依賴它們。

  如果你的項目必須使用Docker的容器,同時只能部署在Linux主機中。這個時候Docker的確是一個不錯的選擇。除此之外,我就看不到使用docker的優勢了,相反你還浪費了vagrant很多的優點:

    • vagrant可以支持多種虛擬環境,例如 VirtualBox, VMware, AWS, OpenStack等等。無論你使用何種虛擬環境,vagrant都可以順利執行起來。如果你使用了Docker,也可以在vagrant中順利安裝docker。
    • vagrant可以降低項目復雜度。或者換個說法:你只需要考慮如何執行你的項目就可以,而不論這個項目是用的docker還是什么別的。在未來,如果出現了docker的競爭者,那么vagrant也可以順利執行它。
    • vagrant可以運行在多個主機環境中,windows(XP以上),MAC(10.5以上),Linux(2.6內核版本以上)。如果你使用了docker,那么vagrant也可以在上面三種操作系統之上運行你的docker。
    • vagrant可以更好的配置網絡和文件共享。比如:vagrant可以給一個VM配置靜態IP和端口數據轉發。不論你使用的VirtualBox還是VMware,vagrant都可以很好的完成配置。對於文件共享來說,vagrant提供了多種文件掛載方案供你考慮。如果你使用了docker,那么這些事情就都需要你親自動手來做了。
    • vagrant 1.6中集成了docker-based development environments。所以在MAC和Windows環境中,vagrant會自動啟動一個虛擬機來執行docker,這樣就達到了docker的跨平台化。而背后例如網絡,文件等等操作都是vagrant默默完成的。

  下面兩點是我聽到docker可以替代vagrant的聲音:

    • "Docker需要移動的數據很少"的確,Docker有這個特點(應該指的是Docker采用的UFS,導致docker每次變動所需的數據很少--筆者猜測)。但是當你在每個項目都使用docker,或者在每個項目的現在,將來都使用docker時,你就會發現docker所產生的數據並不少。而如果你使用vagrant,那么只需要移動一次就可以完成。(原文:"It is less moving parts" - Yes, it can be, if you use Docker exclusively for every project. Even then, it is sacrificing flexibility for Docker lock-in. If you ever decide to not use Docker for any project, past, present, or future, then you'll have more moving parts. If you had used Vagrant, you have that one moving part that supports the rest).
    • "Docker啟動非常快",當使用docker啟動容器時,它比其他虛擬機啟動的都快。但是我要說的是,目前從產品化角度分析所有vagrant主機基本都是啟動一次,然后不再停機。如果從快速部署開發環境來說,docker這個特性真的是非常好。

   所以,我們現在可以得知vagrant和docker是有很大區別的,直接比較這兩個是不正確的。對於開發環境來說,vagrant是一種更為抽象,更為通用的解決方案。Docker所能提供的場景只是vagrant所支持的特殊場景之一。

  在一些極端案例場景下,docker完全可以替代vagrant。但在更多的場景下,這是錯誤的。同時vagrant也不會封鎖你使用docker。

  針對Mitchell的這些解釋,Hykes寫出了下述的論點:

  如果你僅僅是想管理虛擬機,那么你應該使用vagrant。如果你想快速開發和部署應用,那么應該使用docker。

  vagrant是一款管理虛擬機的工具,而docker是一款通過將應用打包到輕量級容器,而實現構建和部署的工具。兩者適用范圍不同。一個容器就是一個包含了應用執行所依賴的數據(包括lib,配置文件等等)。它可以保證應用在一個可重復的環境中隨時執行。

  有了這個容器,就可以很簡單的構建你的容器也可以隨時隨地的進行部署。

  Docker只能在Linux上面執行是一個很大的誤區!事實上,Docker可以在MAC和Windows上面安裝。如果你在MAC上面安裝Docker,那么會有一個大概25MB的精簡Linux VM來充當MAC和docker直接的交流者。一旦Docker安裝完成后,就可以使用同樣的命令進行操作了。這樣,世界一下就美好了:你通過輕量級的容器可以更好的測試和開發你的應用,並且很容易的將這些應用進行分發(比如通過 https://index.docker.io)。而你不需要了解如何管理這些虛擬機,而僅僅把虛擬機當做完成事情中的一個環節而已。

  理論上,vagrant可以作為docker一個抽象數據層。理由如下:

    • 首先,vagrant不是對docker更好的抽象。vagrant設計使用來管理虛擬機的,而docker設計是用來管理應用的。這就意味着docker在設計之初就是為了可以通過多種方式來相互組合應用。在docker中processes, log streams, environment variables ,network links between components是最底層的原型。在vagrant中machines, block devices, and ssh keys是最底層的原型。vagrant工作在系統底層,它同另外一個vagrant容器交互的方式只有把它當做一個可以"boot"和"log into"的機器。因此,你可以在docker上面安裝插件后,執行"vagrant up"命令后等待美好的事情發生。
    • 其次,可鎖定的環境參數(the lock-in argument)。""If you use Vagrant as an abstraction, you will not be locked into Docker!"站在管理虛擬機的vagrant角度上面看,這句說沒有錯:Docker不是另外一個獨立的容器。像EC2和VMware一樣,我們要避免創造一個和其它工具相捆綁的東西。Docker對宿主機沒有任何要求,它允許你通過輕量級的容器在任意地方進行部署。在你部署應用時,不需要考慮應該部署到什么環境中。比如說:你可以在其他人提供的主機(很可能上面已經部署了EC2或者vagrant)上面部署應用。

  所以最后可以說:Vagrant 適合用來管理虛擬機,而docker適合用來管理應用環境。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM