和重複搭建開發環境說 Bye Bye 之Vagrant
- 2019 年 12 月 12 日
- 筆記
「 入職就趕緊投入開發,別費時間搭開發環境。——編程三分鐘」
每每新同事入職,都要在自己電腦上配置一堆環境,費神費力;每每開發測試都要重新配置開發環境,手工搭建,步驟很繁瑣,極易出錯。
大神在時,大神搭建,大神不在,以手撫膺坐長嘆。為此,VVVVVagrant橫空出世!!!
虛擬機編排工具Vagrant

他,基於虛擬機,能打造出完美的物理隔離!
他,一次搭建,處處使用,拷貝一個鏡像就能讓新員工立即投入開發,當屬老闆的最愛!
他,只需要一個文本,寥寥幾行,就能駕馭網路配置、建立集群!
良好的第三方支援也讓他如魚得水,支援shell腳本、支援ansible自動部署等等。他就是我們的主角 Vagrant 。
這次,我們就以搭建python開發環境為例,享受vagrant給我們帶來的便利。
安裝
mac環境兩行命令
brew cask install virtualbox brew cask install vagrant
其他環境下載兩個安裝包即可 vagrant包 https://www.vagrantup.com/downloads.html virtualbox https://www.virtualbox.org/wiki/Downloads
檢查是否安裝成功
$ vagrant version Installed Version: 2.2.5 Latest Version: 2.2.5 You're running an up-to-date version of Vagrant!
初始化環境
第一種下載鏡像的方法
vagrant box add --provider virtualbox centos/7
其中--provider virtualbox
代表校驗是否是virtualbox官方提供 第二種下載方法
vagrant box add --name centos/7 --provider virtualbox /Users/pzqu/Documents/code/test/vbox/centos_virtualbox.box
此處的/Users/pzqu/Documents/code/test/vbox
是我的選定的下載目錄
對box的一系列操作命令文檔見這裡https://www.vagrantup.com/docs/cli/box.html。
初始化
cd /Users/pzqu/Documents/code/test/vbox vagrant init centos/7
此時目錄下會生成一個Vagrantfile
文件,此文件就是自動化配置的關鍵
https://www.vagrantup.com/docs/vagrantfile/
看一看裡面的注釋大概就知道怎麼寫了,主要是ruby的語法,可以掛載本地目錄到虛擬機里,配置網路(接入公網、僅虛擬機訪問都可以)等。
除了對虛擬機進行一些配置外,還可以通過各類Provisioner自動化地安裝軟體、調整配置。 詳見 https://www.vagrantup.com/docs/provisioning/
我的配置比較簡單,使用centos/7的系統,把本機程式碼項目的目錄掛載到/data/code
目錄就可以了。
啟動虛擬機以後直接在虛擬機里安裝開發環境,最後再打成鏡像就妥了。
配置如下
Vagrant.configure("2") do |config| config.vm.box = "centos/7" config.vm.synced_folder "/Users/pzqu/Documents/code/gerrit", "/data/code" end
掛載文件目錄的時候報錯

安裝此插件即可
vagrant plugin install vagrant-vbguest
搭建開發環境
在Vagrantfile
所在目錄下,使用vagrant up
啟動虛擬機 再用vagrant ssh
登陸虛擬機
然後執行以下命令自動安裝我們想要的python環境,注意requirements.txt
是python
項目自動生成的
pip install -r requirements.txt
補充:自動生成requirements
文件的方法
pip freeze > requirements.txt
配置pycharm
打開配置,添加插件

配置Vagrant
環境

指定虛擬機中的Python路徑,第一步選 show all

選擇Vagrant
選擇鏡像目錄與虛擬機中python
路徑


配置啟動方式,這裡我生成swagger,主要是Python interpreter
python路徑,Working direftory
項目路徑(注意是虛擬機中映射的路徑,我這裡在上一節配置的/data/code
,我們在本地開發的時候會自動同步修改)

運行

導出box鏡像文件給別人使用
1.運行 vboxmanage list vms 命令,可以看出我們的vagrant下的虛擬機列表(我的虛擬機只有一個box,「vbox_default_1563884434349_3918「。)
$ vboxmanage list vms "vbox_default_1563884434349_3918" {59864f0b-9731-4839-baa2-95d9a6aab731}
- 導出box鏡像 先關機,再導出。vagrant package是導出box的打包命令
vagrant package --base vbox_default_1563884434349_3918 --output centos7_hanah_environment.box
--base
代表本地 vbox_default_1563884434349_3918
是你要導出的box的名稱 --output
代表導出 centos7_hanah_environment.box
表示導出後的box名為centos7_hanah_environment.box
,並保存在當前目錄下
- 接下來你會看到如下內容,就是導出成功了
$ vagrant package --base vbox_default_1563884434349_3918 --output centos7_hanah_environment.box ==> vbox_default_1563884434349_3918: Exporting VM... ==> vbox_default_1563884434349_3918: Compressing package to: /Users/pzqu/Documents/code/test/vbox/centos7_hanah_environment.box
喝完一瓶奶的功夫就完成了,這取決於你的box的大小,我的box大約900M。 這下直接發給你的朋友,一句命令就獲得了一個和你完全相同的開發/測試環境。
$ vagrant box add centos7_hanah_environment ./centos7_hanah_environment.box ==> box: Box file was not detected as metadata. Adding it directly... ==> box: Adding box 'centos7_hanah_environment' (v0) for provider: box: Unpacking necessary files from: file:///Users/pzqu/Documents/code/test/vbox/centos7_hanah_environment.box ==> box: Successfully added box 'centos7_hanah_environment' (v0) for 'virtualbox'!
vagrant box add 別名 box名
其他想法
聽起來vagrant所做的這些事情和docker有很多重疊的地方,為什麼不直接用docker來做呢?不僅可以一秒啟動一個最適合的環境,而且又輕量又純凈。
權衡利弊,vagrant本身並不是虛擬化技術,要把他跑起來還要安裝virtualbox等虛擬化平台,他更像是虛擬機的外掛程式、編排工具;針對的是批量虛擬機的管理,常常用於瞬間創建一個開發環境。
而docker本身就是虛擬化技術,構建迅速,不佔用資源;針對的是應用程式的編排,常常用於統一開發環境與生產環境。
說來說去,與其說是vagrant與docker,不如說使用是虛擬化平台與容器之間的區別。

docker還是依賴於系統內核,如果內核不同,需要重新構建。
有時間我們來聊聊docker創建開發環境,有機會再來聊聊Docker Machine