Vagrant是一个基于Ruby的工具,用于建立和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef建立自动化虚拟环境了,安装方法是很是的简单的,下面一块儿来看看Vagrant使用与入门技巧.
web
1.1 项目初始化shell
Vagrant使用Vagrant文件做为配置文件,该文件中定义了项目的根目录,Vagrant的不少配置都是基于这个配置的根目录进行的,同时,该文件也描述了项目运行所须要的机器类型以及其它资源(好比安装哪些软件等)。
要初始化一个Vagrant项目,使用命令vagrant init命令,使用该命令后,会在当前目录建立一个名为Vagrantfile的配置文件,修改该文件改变Vagrant项目的行为。apache
$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant initbootstrap
Vagrant使用盒子(box)建立开发环境,所谓的盒子就是一个已经配置好的基础的虚拟机镜像,Vagrant避免了每次建立项目都去从新建立虚拟机,而是按照Vagrantfile文件的配置从基础镜像建立这个Box。
能够在已经存在的项目上使用vagrant init命令,该命令只会建立配置文件,并不会对原有项目形成影响。若是须要,能够将该配置文件Vagrantfile加入到项目的版本控制中,这样团队中的其它开发者就能够快速的创建起开发环境已进行运行调试了。
在建立Vagrant项目的时候,首先须要作的是添加一个Box,经过使用命令vagrant box add添加一个盒子,Vagrant网站上提供了不少其它开发者共享的Box,咱们能够直接复用,在Vagrant Cloud上能够查找你须要的Box而且添加到本地。centos
$ vagrant box add chef/centos-6.5bash
添加的盒子是能够被多个项目同时使用的,项目在初始化Box的时候并不会修改添加的基础Box,而是克隆一份Box的副本,在副本上进行配置。
添加盒子以后,咱们须要配置项目使用这个盒子做为基础,修改Vagrantfile文件:网络
Vagrant.configure("2") do |config|
config.vm.box = "chef/centos-6.5"
endssh
注意: 若是这里指定的box没有添加过,则Vagrant会自动去下载该Box。tcp
1.2 启动并运行项目工具
在配置完成后,就能够启动该虚拟环境了,使用命令vagrant up启动开发环境。
$ vagrant up
启动以后,咱们可使用ssh链接到该虚拟机上:
$ vagrant ssh
如今你已经链接到该虚拟机上了,你能够像操做普通Linux系统同样作你但愿作的事情。
注意的是,在该虚拟机上进行rm -fr /操做的时候请谨慎一些,由于在该虚拟机中,挂载了/vagrant目录,该目录是与你主机的项目共享的,删除的话会将项目删除掉。
在该虚拟机使用完成后,若是再也不须要了,可使用vagrant destroy命令移除该虚拟机。
提示: 默认配置下,虚拟机中的/vagrant目录与主机上的项目目录是同一个目录,该目录中的全部操做都会自动同步。
1.3 建立项目初始化脚本
每次初始化系统的时候都须要从新安装软件是一件很是麻烦的事,所以,Vagrant提供了一种简单的方式来帮咱们完成这个过程,在创建虚拟机的时候能够指定自动执行脚本。
在项目目录下建立一个bootstrap.sh的脚本文件:
#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
rm -rf /var/www
ln -fs /vagrant /var/www
该脚本是在Ubuntu环境下使用的,若是你是用的Box是CentOS,则不能使用apt-get命令了,而应该使用yum命令完成程序的安装。
接下来,咱们须要配置Vagrantfile文件,让其在创建环境的时候自动执行该脚本。
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise32"
config.vm.provision :shell, path: "bootstrap.sh"
end
这样配置以后,使用命令vagrant up启动虚拟机的时候,该脚本就会自动执行,完成虚拟机的初始化了。
若是你的虚拟机已经处于运行状态了,能够经过使用命令vagrant reload --provision快速的从新启动虚拟机,命令中的--provision告诉Vagrant在重启的时候运行provisioners的配置,一般状况下,provisioners的配置只在执行vagrant up命令的时候才会执行。
1.4 网络配置
Vagrant提供了端口转发功能,经过将虚拟机中的端口映射到主机的不一样端口,咱们能够在主机中使用映射后的端口访问虚拟机中的服务。
例如:
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise32"
config.vm.provision :shell, path: "bootstrap.sh"
config.vm.network :forwarded_port, host: 4567, guest: 80
end
使用如上配置启动虚拟机以后,就能够在主机上使用http://127.0.0.1:4567访问虚拟机上的Apache提供的Web服务了。
1.5 Teardown(虚拟机卸载)
当你但愿切换到其它项目上开发或者是当你要出去吃午餐,你下班了的状况下,你须要清理一下你的开发环境,这个时候,Vagrant提供了三种方式,它们各有各自的优缺点,所以,你须要本身去权衡你但愿采用哪一种方式。
Suspending (挂起) 执行命令vagrant suspend将会保存当前虚拟机的运行状态而且中止它,跟主机挂起是同样的,当你须要再次启动的时候,使用vagrant up命令将会恢复以前的运行状态。这种方式的优势是,启动很迅速,能够很快进入开发环境中,缺点是会占用比较多的磁盘空间,由于虚拟机将内存中的数据都存储到了磁盘上。
Halting(中止) 这种方式是正常的中止虚拟机,使用虚拟机的关闭命令完成,当须要从新使用的时候使用命令vagrant up从新启动虚拟机,该方法与计算机冷启动同样,缺点是启动的时候耗时比较多,依然占用部分磁盘空间。
Destroying(销毁) 该方式将会销毁虚拟机,不会再占用磁盘空间,下次启动的时候将会从新创建开发环境,包括下载软件等等。
Vagrant使用技巧
1.1 如何调试
在使用Vagrant过程当中,不免会出现一些不稳定的因素而形成一些使用上的bug,所以,Vagrant提供了Debug日志的方式用于调试,能够方便的查找错误的缘由,以便快速解决问题。
要容许启用日志功能,须要在主机上设置环境变量VAGRANT_LOG为须要的日志级别,包含debug, info, warn, error。当你须要查找错误产生的缘由的时候,一般使用日志级别info,这种状况下你能够获得包含重要信息的比较干净的日志。
在Linux和Mac系统上,你能够经过下面的方式设置:
$ VAGRANT_LOG=info vagrant up
在Windows下,你需分开写:
$ set VAGRANT_LOG=info
$ vagrant up
固然,你也能够不用这种方式,只须要在启动的时候增长参数--debug便可。
$ vagrant up --debug
1.2 如何使用插件
Vagrant中提供了不少能够直接使用的插件,使用这些插件,能够极大的减小配置开发环境的工做量,Vagrant的大部分核心功能都是基于插件实现的。
Vagrant使用命令vagrant plugin install安装插件。
$ vagrant plugin install vagrant-example-plugin
插件安装完成后,将会在Vagrant启动的时候自动加载,若是插件加载过程当中出现错误,不会影响Vagrant的启动,而是会输出插件加载失败的错误信息。
插件安装完成后,你应该查看插件开发文档获取如何使用该插件,通常能够经过vagrant命令使用插件的命令,若是插件提供了provision的话,能够经过config.vm.provision进行配置。
插件的更新比较简单,使用命令vagrant plugin update便可更新所有插件,使用vagrant plugin update NAME能够更新指定插件。
插件卸载使用命令vagrant plugin uninstall。
$ vagrant plugin uninstall vagrant-example-plugin
查看安装了哪些插件:
vagrant plugin list
1.3 如何配置网络
在Vagrant中,全部的网络配置都在Vagrantfile中的config.vm.network方法中。
Vagrant.configure("2") do |config|
# other config here
config.vm.network "forwarded_port", guest: 80, host: 8080
end
每一种网络类型都有一个标识符如:forwarded_port,它后面跟着一串配置选项。在端口跳转的例子中,提供了两个参数,虚拟机中的端口号和主机中映射的端口号。
若是须要多个网络配置,使用多个config.vm.network便可。
如何进行端口跳转
端口跳转功能容许你经过TCP或者是UDP直接访问主机上的指定端口,该端口的请求会被转发到虚拟机上的指定端口。
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
上面的配置将会主机上对8080端口的访问转发到虚拟机上的80端口。
下面是该配置(forwarded_port)支持的参数:
guest (int) 但愿暴漏给主机的虚拟机端口
guest_ip(string) 但愿绑定的IP,该IP与guest指定的端口暴漏给主机,默认为空,全部网卡接口。
host(int) 但愿使用来访问虚拟机的guest端口的主机端口号
host_ip(string) 主机的IP地址,用于绑定到跳转的端口,若是不指定,则使用全部IP。
protocol(string) 可选tcp或者udp,默认为tcp.
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'tcp'
config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'udp'
end
1.4 如何配置同步目录
使用config.vm.synced_folder方法配置同步目录。
Vagrant.configure("2") do |config|
# other config here
config.vm.synced_folder "src/", "/srv/website"
end
以上配置中,synced_folder方法的第一个参数为主机上要跟虚拟机同步的目录,第二个参数为要挂载到虚拟机上的路径。
能够配置参数disabled: true禁止目录同步。
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/srv/website", disabled: true
end
默认状况下,Vagrant设置同步文件夹的属主/组为SSH用户,若是须要修改的话,使用下面配置:
config.vm.synced_folder "src/", "/srv/website", owner: "root", group: "root"