Vagrant 是一款用于构建虚拟开发环境的工具,非常适合web应用开发。
通常我们可以通过Vagrant封装一个Linux开发环境,分发给团队成员。然后可以运行在各个系统平台上(Win/Mac/Linux)上,保证了环境的统一性和标准性。
下载安装
1.首先下载安装VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads(当然也可以使用VMware,不过不免费的)
2.然后下载安装Vagrant 下载地址:http://downloads.vagrantup.com/
3.接着需要下载一些打包好或者官方的基础的镜像,这些镜像我们都称为box。这里由于我是centos, 大家可以下载和我一样的
CentOS 6.5 x86_64 地址 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
更多包可以在这里下载 http://www.vagrantbox.es/
环境搭建
1.首先将下载的镜像box 添加到Vagrant ( 由于我使用Win路径大概形如D:\box\centos65-x86_64-20140116.box,如果是Linux 路径形如 ~/box/centos65-x86_64-20140116.box 总之需要根据你实际下载存放在本地的路径来)
vagrant box add centos D:\box\centos65-x86_64-20140116.box //centos是我给这个box起的名字,后面路径就是本地box存放的路径
2.添加后box后我们需要初始化开发环境,个人建议换一个目录来初始化(例如 Win下 D:\lnmp, Linux下 ~/lnmp), 至于为什么建议这么做后面会介绍。
切换到新目录后我们开始执行下面命令
vagrant init centos //这边名称和上面的box名称保持一致
3.初始化后会当前目录下生成一个配置文件Vagrantfile,这个文件非常重要,虚拟机的配置就是基于此,在这里讲2个比较个人认为比较高频实用的配置项
Ⅰ.Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80
这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile
,将下面这行的注释去掉(移除#
)并保存
config.vm.network "private_network", ip: "192.168.33.10"
这样我们就能用 192.168.33.10
访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行
Ⅱ.Vagrant默认分配的内存是比较小的,内存比较小的情况有一些比较消耗内存的组件比如Mysql5.7就是无法安装的。所以自然我们想到修改内存大小,Vagrantfile
也提供了这种修改的可能,我们需要移除以下几行的注释(移除#
)并保存
config.vm.provider "virtualbox" do |vb| vb.memory = "1024" //这里就是修改后内存的大小,可以根据自己的需要进行修改 end
4.初始化之后在当前目录下启动Vagrant
vagrant up
5.然后我们登录虚拟机,对于Linux环境直接执行vagrant ssh即可登录,默认是登录账号是vagrant,如果需要提权 可以执行su root 密码也是vagrant 对于Win环境无法执行vagrant ssh,需要借助Putty等工具来登录,具体登录还需要根据Vagrantfile网络配置来区别对待,如果是host-only模式,直接ssh到虚拟ip 比如我上面的虚拟ip就是192.168.33.10(22端口),如果是nat模式,需要ssh到127.0.0.1,(默认是2222端口,这里存在端口转发,通过访问本地2222,转发访问到虚拟机的22) 登录后可以根据自己的需要来安装lamp或者lnmp之类的环境。
6.登录之后往往会遇到一个现实的问题,就是如何同步或者是如何共享虚拟机和物理机的文件目录来达到本地代码编写的需求,也就是我们希望本地的代码写完,能自动映射到虚拟机里某个目录上,这也是我们刚才建议大家用一个独立的目录来初始化的原因。因为Vagrant会把启动目录作为虚拟机的/vagrant目录来共享或者说是映射。
也就是说我本地的Win下 D:\lnmp, Linux下 ~/lnmp就是对应到我们虚拟机/vagrant ,那么我们在本地目录里编写项目,只要在虚拟机的nginx或者apache配置中指定项目目录到/vagrant下就可以达到本地编写代码虚拟机立刻生效的效果。完美!
打包分发
以上下载安装配置启动使用后还有一个重要的点就是分发,也就是我们一开始说的我们在环境搭建部署后需要打包一个基于自己团队需要的新的包,然后分发给团队小伙伴让大家的开发环境,各个软件的版本环境都是统一的。在当前目录下,也就是有Vagrantfile的目录下执行
vagrant package
就会打包并在当前目录下生成一个package.box的文件,然后把这个文件给其他小伙伴,再按照上文的添加初始化就能得到一个完全一致的开发环境了。
再附上几个常用的命令
vagrant up # 启动虚拟机 vagrant halt # 关闭虚拟机 vagrant reload # 重启虚拟机 vagrant ssh # SSH 至虚拟机 vagrant status # 查看虚拟机运行状态 vagrant destroy # 销毁当前虚拟机
再说几句
问题一:使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。这其实也是VirtualBox 在使用sendfile
时的一个bug导致的,官方原文如下
There is a VirtualBox bug related to
sendfile
which can result in corrupted or non-updating files. You should deactivatesendfile
in any web servers you may be running.
所以我们需要对虚拟机里的 Apache/Nginx 配置文件进行修改:
In Nginx:
sendfile off;
In Apache:
EnableSendfile Off
问题二:启动多个虚拟机提示错误“2222 端口 in use”
启动多个虚拟机提示错误“2222 端口 in use”
解决办法:(参考文章:Vagrant SSH errors with multiple VMs: Port 2222 in use)
config.vm.network "forwarded_port", guest: 22, host: 2220 ,id: 'ssh'//在Vagrantfile中添加并修改host的数字,改成其他不冲突的数字即可
问题三:之前在群里听小伙伴说Vagrant 的box存在依赖虚拟机版本的兼容问题,部分box在不同系统,不同VirtualBox下会出现致命错误。
我个人Win机器VirtualBox 是5.0.16,Mac下VirtualBox 是4.3.30,Vagrant均为1.8.1,从Win制作一个centos包到Mac下加载初始化运行均正常。因为测试非常有限,所以这个坑大家留意,或者有更多测试数据也可以评论留言讨论。
参考
https://segmentfault.com/a/1190000000264347
http://www.jianshu.com/p/6bf70d551a0d
http://jamestw.logdown.com/posts/231571-vagrant-in-early-experiences
https://www.vagrantup.com/docs/synced-folders/virtualbox.html
陈姐写的言简意赅,来捧下臭脚~ 😛
欢迎欢迎
vagrant init geerlingguy/centos7 \
–box-version 1.2.3
利用vagrant cloud去初始化,这样不需要下载BOX文件了
https://app.vagrantup.com/geerlingguy/boxes/centos7/versions/1.2.3
可以的,下次试试