淺談 vagrant

今天來聊聊一個對開發網頁很有用的工具 Vagrant。

logo_vagrant-81478652

有做網頁開發的朋友都應該知道,做一個網站並不是只懂一個語言就可以,一個完整的網站需要 back-end 和 front-end 的支持,做 back-end 選擇一向很多,你可以用 java, ruby, python, c#, php….,前端一般是指 javaScript, hmtl, css。不過近年來很流行 single page application,前端的比重也越來越大,一些選擇也跟著出來,像是coffee script, 或是 facebook 最新新出的 React。除了語言的選擇以外,不同的語言也需要對應不同的 server, 像是php可能就會選用apache, java可能用jBoss之類的。

前面說了拉拉渣渣一大堆,其實我只想指出一點,就是開發環境很難設定,舉個例子來說,假如我現在在一個10人的開發團隊裡面,有人寫前端,有人寫後端,有人都寫,理想狀態是每個人的電腦開發環境都一樣,所以大家的電腦跑出來的結果也都一樣,但是現實上,這是很難做到的事,或許大家一開始的開發環境都一樣,但是可能寫後端的人對server 做一些修正,讓他的code 可以跑得更順,但是沒跟其他九個人說,結果就導致只有程式只在他的電腦上跑得順,還有另一種情況是,有新的版本的library出來,有人更新快,有人更新慢,常常導致整個團隊在協調這種事上要花很多時間。

另一種很常見的狀況就是,寫前端的常常要跟不同的後端接軌,然後需要的 server也不同,然後導致電腦上可能裝四五個server,除了讓電腦變慢以外,光是設定這些server 就常常要花很長的時間。還有一種情況就是, server 大部分都是放在 linux OS裡,但是大部分人最常拿到的電腦卻是Windows OS,雖然很多應用程式都有出兩個版本,但是實際使用上,卻常常出現不一致,或是很慢(架如有人用過grunt 或是 broccoli就知道我在說什麼)

這時,vagrant 就出現了,說穿了 vagrant 就是一個很簡單的 helper tool,建構在虛擬機器上。就拿上面說的例子來講,我在一個10人的團隊裡面,這次我不把環境直接裝在每個人的電腦裡,反之,我先裝虛擬機器的工具 (像是virtual box),然後再把 已經設定好環境的虛擬機器裝在每個人的電腦裡,這樣的好處是什麼?這樣可以確保每個人的環境都是一樣的,萬一需要修正(像是有新的版本出現),我只需要更新 virtual image,然後每個人就重新裝新的虛擬機器,這樣大家的環境又是一樣的。

大家有沒有發現,做到以上事情,其實我們只要virtualbox,那vagrant 做了什麼呢?讓我來說明吧

1. vagrant 簡化了整個virtualization的方法,只要3 個 commands,你就可以完成安裝或是更新虛擬機器,而且確保大家都是一樣的設定,不會有人給了 2gb ram ,有人給 4gb ram。

2. vagrant 會同步你的code 到虛擬機器上,所以你的 code還是在你自己的電腦上,只是每次當你 save時,你的 code 會被同步到虛擬機器上面,然後你可以執行所有的 compile / build process在虛擬機器上,這樣有兩個好處,第一,你並不需要因為用了vagrant 就改變你寫code的習慣,你還是可以用你喜歡的 text editor來寫code,第二,虛擬機器只負責執行,並不儲存真正的code,萬一需要更新時,vagrant 可以直接刪除虛擬機器,而不會失去結果。

3. vagrant會跑一些pre script (像是shell script ) 在虛擬機啟動時,這樣的好處是,萬一有不同的需要在不同的情況,你可以暫時的改變環境達到你的目地。

說真的,vagrant 還有很多好用的功能,在這裡就不一一介紹了,有興趣的話,可以去

http://www.vagrantup.com 看看

 

 

喜歡這篇文章嗎? 分享出去給作者一點鼓勵吧!
  • tangblack [ 小黑宅 ]

    Hi!
    請問 Mr. Halloween 或是其他人有用過 docker 嗎?
    撇開架構層面(ex: docker 不是跑在 VM 上)不談

    他們在實際應用上的差別是?
    想聽聽看兩個用過的大大分享

    🙂

  • William Yeh

    Vagrant 模擬出 production machines,
    Docker 則封裝 app 及相關的 dependencies,以一種 isolated 的方式。

  • tangblack [ 小黑宅 ]

    Hi 秉哲大,
    重新拜讀您的Vagrant Tutorial系列
    其中 http://www.codedata.com.tw/social-coding/vagrant-tutorial-4-guest-host-communication
    有提到在 vagrant 上灌 docker 上灌 redis

    我好奇的是
    不是 1) 直接在 vagrant 上灌 redis 就好了嗎?
    又或者 2)直接在 docker 上灌 redid 就好了?

    所以說
    雖然 vagrant 和 docker 分別都做得到一樣的效果
    在實務上的應用
    vagrant 拿來產生 production 的基礎環境
    docker 拿來產生 app 需要的環境

    比如說我今天要 production 環境是要一台 linux 跑 jboss server 跑 web service
    我的做法就會是
    -vagrant 產生 linux + jvm(還是 jvm 應該算是 app 需要的環境)
    -docker(1) 產生 jboss server
    如果 production 環境又要在同一台 linux 上裝 mysql
    -我的做法就是在另外做一個 docker(2) 產生 sql server
    -vagrant 上同時跑 docker(1) 和 docker(2)

    我認知這樣玩
    要同時瞭解 docker 和 vagrant
    而且網路設定也要設兩次
    不如一次選用一套(vagrant/docker)搞定

    以上我的理解不知是否有錯?

    PS: 現在我都不知道我是在寫 code 還是在當 SA 了 XD

  • William Yeh

    這是對待 Vagrant 軟體的觀點不同。

    我只把 Vagrant 視為一個『在本機端模擬伺服器』的軟體,不想把它視為『部署至伺服器』的軟體。

    回到前面的 Redis 例子。

    這個例子的 context 是:「我的伺服器,用的 Redis,是『Docker 化的 Redis』。」