Vagrant跨平台开发
做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各麻烦的问题是实际部署的环境通常是Linux,常常还要面临着开发和部署环境不一致,上线前还要大量的调试。更要命的是,如果有很多机器需要装的话,那就真是一个灾难了。
Windows下玩Linux少不了虚拟机,但装系统依旧是相当费事。在现在什么都在自动化的今天,Vagrant就是这么一个神器,基于Ruby开发,使用开源 VirtualBox 作为虚拟化支持,可以轻松的跨平台部署。
今天试着把几台机器的环境都换成Vagrant,很爽很顺畅,于是就试着整理了一下使用小结:
Vagrant 是什么?
Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。
我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。
准备工作
下载安装 VirtualBox :https://www.virtualbox.org/
下载安装 Vagrant :http://www.vagrantup.com/
下载需要使用的 box :
官方提供的范例:http://files.vagrantup.com/precise32.box
还可以在 http://www.vagrantbox.es/ 这里下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。
由于习惯用CentOS,于是我就下了CentOS 6.3 x86_64 minimal,这个Box根据个人情况进行选择即可。
环境设置
添加镜像到 Vagrant
假设我们下载的镜像存放路径是 E:/box/precise64.box
,在终端里输入:
1 | $ vagrant box add base CentOS-6.3-x86_64-minimal.box |
base
是我们给这个 box 命的名字,E:/box/precise64.box
是 box 所在路径
初始化开发环境
创建一个开发目录(比如:E:/dev
),你也可以使用已有的目录,切换到开发目录里,用 base
镜像初始化当前目录的环境:
1 | $ cd E:/dev # 切换目录 |
你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。
1 | $ vagrant ssh # SSH 登录 |
E:/dev
目录对应虚拟机中的目录是 /vagrant
Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 等。
其他设置
Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile
的配置文件,可以修改配置文件进行个性化的定制。
Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80
这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile
,将下面这行的注释去掉(移除 #
)并保存:
1 | config.vm.network :private_network, ip: "192.168.33.10" |
重启虚拟机,这样我们就能用 192.168.33.10
访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。
Vagrant 网络配置的三种模式
1、较为常用是端口映射,就是将虚拟机中的端口映射到宿主机对应的端口直接使用 ,在Vagrantfile
中配置:
1 | config.vm.network :forwarded_port, guest: 80, host: 8080 |
guest: 80
表示虚拟机中的80端口, host: 8080
表示映射到宿主机的8080端口。
2、如果需要自己自由的访问虚拟机,但是别人不需要访问虚拟机,可以使用private_network,并为虚拟机设置IP ,在Vagrantfile
中配置:
1 | config.vm.network :private_network, ip: "192.168.1.104" |
192.168.1.104
表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可
3、如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP
,那么在Vagrantfile
中配置:
1 | config.vm.network :public_network |
Vagrant 目录映射
既然是开发环境,那么开发工作肯定还是需要在本地完成,而不是都要进到虚拟机中去完成,虚拟机就好好在后台运行服务就好了,不然就本末倒置了,所以这里就需要使用目录映射功能,将本地的目录映射到虚拟机的对应目录。
默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant
目录,当前目录下的文件可以直接在 /vagrant
下进行访问,当然也可以在通过 ln
创建软连接,如
1 | ln -fs /vagrant/wwwroot /var/www |
来进行目录映射,当然,从自动化配置的角度,能不进系统就不需要进系统,所以在Vagrant也可以进行目录映射的操作:
1 | config.vm.synced_folder "wwwroot/", "/var/www" |
前面的参数 “wwwroot/
” 表示的是本地的路径,这里使用对于工作目录的相对路径,这里也可以使用绝对路径,比如: “E:/www/
”
后面的参数 “/var/www
” 表示虚拟机中对应映射的目录。
Vagrant 打包分发
当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:
1 | $ vagrant package |
打包完成后会在当前目录生成一个 package.box
的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。
Vagrant 常用命令
1 | $ vagrant init # 初始化 |
Vagrant 的一些注意事项
使用 Apache/Nginx
时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx
配置文件进行修改:
1 | # Apache 配置添加: |