vagrant使用小记


vagrant是一个简单实用的适合本地开发使用的虚拟机管理工具。默认基于virtualbox,也可以切换为基于vmware的模式。基于Ruby的配置文件相对在命令行操作virtualbox更容易些,特别是配置多虚拟机的情况下。以下主要是个人在使用时记录的一些点。

安装

ubuntu可以直接用apt-get安装。不过12.04版本的ubuntu对应的vagrant配对的是ruby 1.8,这可能不是你想要的。这时你可以从vagrant官网上下载deb,用dpkg -i方式安装。
因为我之前就装过virtualbox和ruby 1.9,所以不清楚如果这两个没有的时候dpkg -i安装时是否有问题。virtualbox和ruby实际也是用apt-get安装的。

下载base box

因为vagrant实际是操作virtualbox的,所以实际需要一个类似vbox的文件,或者说是安装了指定系统的虚拟硬盘,又称base box。如果你没有base box的话,就需要自己加载对应操作系统镜像逐步安装。
vagrant给的方法是执行

vagrant box add base http://files.vagrantup.com/precise32.box

后面的URL实际就是vagrant提供的一个base box。执行这条命令时,vagrant会下载这个base box然后加入box列表中。有兴趣的人可以执行

vagrant box list

查看所有安装的box。

初始化和启动

进入某个目录,比如你的开发目录,执行

vagrant init

这条命令初始化vagrant的执行环境,实际上就是放一个叫做Vagrantfile的配置在当前目录。接着执行

vagrant up

启动虚拟机。默认情况下vagrant认为你需要一个机器就可以了,而且不指定box的名字的话实际使用的就是base,这里的base就是之前执行box add时候的参数。

ssh登录

默认启动是headless的,换句话说,是没有界面的。而virtualbox的GUI上操作启动的虚拟机默认是有界面的。登录headless的服务器一般用ssh。vagrant中只需要输入

vagrant ssh

即可。不用输入用户名和密码。细心的用户应该看得出来,这里使用的是证书登录。实际的证书位于~/.vagrant.d/insecure_private_key,有兴趣的人可以看下。登录用户名为vagrant,默认vagrant加入了sudo用户组(估计base box里面做的),换句话说要执行某些root才能做的事情时,sudo+命令即可。

关闭虚拟机

用Ctrl + D或者exit从ssh中退出后,如果你想要关闭虚拟机的话,除了打开virtualbox关闭之外,还有通过vagrant关闭的方式,应该说通过vagrant才是“正确的“关闭方式吧。

vagrant halt

以下是高级一些的功能。

自己制作base box

你在现有的base box上做了一些修改,比如安装了apache, mysql, php,你不想每次从base box重新安装,你需要让现在的box变成一个你用的base box。那么你可以执行如下命令

vagrant package
vagrant box add name_of_your_box package.vbox

vagrant package默认打包的box的名字是package.vbox,add box时除了用URL之外还可以直接用本地文件。给你的box设置一个好名字,以后你就可以通过

vagrant init name_of_your_box

直接初始化一个基于你的box的虚拟机了。

宿主机到客户机的访问

经常有这种需求,就是虚拟机中配置了一个应用,比如网站。你需要从外部访问。这里的外部大部分时候就是你的宿主机。为了让宿主机访问客户机,常规的virtualbox的做法是配置一个host_only的网络适配器。在vagrant中,你只需要修改配置文件Vagrantfile,

config.vm.network :private_network, ip: "192.168.33.10"

具体配置可能要根据Vagrantfile中注释部分有所改动,因为vagrant的配置语句好像有变化。ip这里似乎可以随便设定。

同步目录

同样是在Vagrantfile中配置。

config.vm.synced_folder "../foo", "/etc/foo"

第一个参数是你的宿主机目录,可以用相对目录。第二个参数是客户机的挂载的绝对目录。

端口映射

访问客户机中的网站其实还有另外一种方法,就是端口映射,比如把客户机的80端口映射到本地的4567端口(4567好像是sinatra的默认端口)。其实ssh也是这样做的,在没有开启host_only的访问前,必须通过客户机22端口映射到本地2222端口,然后本地ssh 127.0.0.1:2222连接客户机。

配置如下:

config.vm.network :forwarded_port, guest: 80, host: 4567

多虚拟机配置

估计是本文中最复杂的配置了,但是理解起来不会很难。

config.vm.define :app do |app_config|
  app_config.vm.box = "base"
  app_config.vm.network :private_network, ip: "192.168.33.11"
end 

config.vm.define :db do |db_config|
  db_config.vm.box = "base"
  db_config.vm.network :private_network, ip: "192.168.33.12"
end 

注意里面的define用法,并替换掉原先的config.vm.box = ‘xxx’的配置。
这里定义一个app和db两个虚拟机,并设置私有网络和IP地址。

至此,vagrant的简单使用介绍算是完成了。

, ,