Vagrant 是一个虚拟机管理工具,非常适合用于搭建开发环境。它提供了一套易用的配置规则,比人工操作或者使用虚拟机软件提供的命令行要方便,且可重复。这里说的虚拟机一般用的是 VirtualBox。
Vagrant 与 rvm 等工具不同的是,rvm 管理的是 Ruby 的版本,Vagrant 是管理整个虚拟机。无论开发人员用的是 Windows 还是 Mac,都可以跑一个一致的 Linux 开发环境。所以如果你想快速安装/重置虚拟机,或者给开发组成员部署完全一致的开发环境,Vagrant 就是你需要的。
你需要预先安装 VirtualBox,然后到这个页面下载安装包:
http://downloads.vagrantup.com/
Vagrant 启动非常简单,就两行命令:
$ vagrant init precise64 http://files.vagrantup.com/precise64.box
$ vagrant up
第一条命令在当前目录下创建了一个名为 Vagrantfile
的配置文件。这条命令指定了 Vagrant 所使用的 box(Vagrant 中打包好的虚拟机文件) 名为 precise64
,如果本机没找到这个 box,就到http://files.vagrantup.com/precise64.box
下载所需要的 box。
由于是第一次使用 precise64
这个 box,需要从网络下载完整的虚拟机镜像,这个过程需要十几分钟,下载完成后就可以重用到别的配置文件中。
下载完成后,vagrant up
就可以启动虚拟机。
启动虚拟机后,默认是跑在后台,并且不显示图形界面的,这时候需要用 ssh 连接虚拟机:
$ vagrant ssh
然后就登陆上虚拟机了,跟 VPS 差不多。但是与 VPS 不同的是,Vagrant 默认配置了一个同步目录:
vagrant@precise64:~$ ls /vagrant/
你会看到本机的 Vagrantfile
文件所在目录下的所有内容。同步目录的好处是,你可以在本机上用自己喜欢的开发工具编辑文件,然后在 Vagrant 里面用另一套环境跑,Vagrant 里面安装的软件不污染你的主机。
Vagrant 有3种关闭方法。
vagrant suspend
将虚拟机挂起,虚拟机内存都保存到硬盘上,下次可以快速恢复。
vagrant halt
将虚拟机关闭,虚拟机内存释放,下次启动要慢一点。
vagrant destroy
将虚拟机删除,所有变更都丢失,下次启动要重新克隆一个 Vagrant box。
无论那种方式关闭,要再启动 Vagrant 都是用 vagrant up
命令。
Vagrant 的网络配置支持3种:
将虚拟机的某个端口绑定到本机端口。
分配给虚拟机一个私有 ip,这样可以在本机上访问虚拟机的所有端口。
让虚拟机暴露在真实的网络中,跟本机同等。
用来开发的话,Forwarded ports 和 Private networks 就够了,如果要开放的端口比较多并且要用 rsync 这样的工具的话,Private networks 更方便。如果要给内网部署 Gitlab 这样的工具给团队使用,则使用 Public networks。
Vagrant 启动的是完整的虚拟机,并不限定用来做什么,我们可以用这个虚拟机练习配置服务器,跑应用的开发环境……等等,取决于你的需要。
下面举两个例子。
新建一个测试目录:
$ mkdir -p ~/workspace/nginx-test
$ cd ~/workspace/nginx-test/
新建配置:
$ vagrant init precise64 http://files.vagrantup.com/precise64.box
$ vagrant up
由于之前已经下载过 precise64 这个 box,这里不需要再下载,只要克隆过来就行了。启动完成后,登陆 ssh:
$ vagrant ssh
在 Vagrant 虚拟机内,安装 nginx:
vagrant@precise64:~$ sudo apt-get update
vagrant@precise64:~$ sudo apt-get install nginx
这时候 nginx 已经装好了,但是发现没办法在主机访问到虚拟机的服务,我们还需要设置端口映射。在本机 Vagrantfile 的配置块中添加一行配置:
config.vm.network :forwarded_port, guest: 80, host: 8080
这行配置把虚拟机的 80 端口映射到本机的 8080 端口,然后重启虚拟机。
vagrant@precise64:~$ exit
$ vagrant reload
打开浏览器,访问 localhost:8080
,就会看到 Welcome to nginx!
字样,说明访问虚拟机内的 nginx 成功了。
先创建一个 Rails 项目(或者你原有的项目):
$ rails new foo
$ cd foo/
创建 Vagrant 配置:
$ vagrant init precise64 http://files.vagrantup.com/precise64.box
跟上一个例子不同,这里使用 Pravate network,修改 Vagrantfile,在配置块中添加这一行:
config.vm.network :private_network, ip: "192.168.33.10"
然后启动:
$ vagrant up
启动完成后,登陆 ssh:
$ vagrant ssh
安装 RVM,Ruby 2.0.0:
vagrant@precise64:~$ sudo apt-get update
vagrant@precise64:~$ sudo apt-get install curl
vagrant@precise64:~$ curl -L https://get.rvm.io | bash -s stable
vagrant@precise64:~$ source ~/.bash_profile
vagrant@precise64:~$ rvm install 2.0.0
进入 Vagrant 默认同步目录并启动 rails 开发服务器:
vagrant@precise64:~$ cd /vagrant/
vagrant@precise64:/vagrant/$ bundle
vagrant@precise64:/vagrant/$ sudo apt-get install nodejs
vagrant@precise64:/vagrant/$ rails s
浏览器打开 http://192.168.33.10:3000/
,会看到 Rails 项目的首页。在本机用喜爱的编辑器或 IDE 开发项目,文件会即时同步到 Vagrant 的虚拟机内,就像在本机启动的一样。
Vagrantfile 可以提交到版本控制里面一并管理。
Vagrant 还有一些值得留意的特性,这里简单介绍:
设置初始化安装脚本,把 Nginx,RVM,MySQL 这些包的安装过程写成脚本,第一次 vagrant up
的时候执行,这样新来的开发成员就不用重复操作。
Vagrant 官方只提供了 Ubuntu LTS 的 box,需要打包 CentOS,OpenSUSE 之类的 box 可以自己动手。
所以,如果你希望能快速安装/重置虚拟机来做服务器测试,或者正为团队成员搭建开发环境而困扰,那么赶紧使用 Vagrant。
(完)