小众知识

使用 Vagrant 打造跨平台开发环境
2015-11-21 18:34:23   来源:   评论:0 点击:

Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php python ruby java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。

Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。

我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。

安装步骤

1. 安装 VirtualBox

虚拟机还是得依靠 VirtualBox 来搭建,免费小巧。
下载地址:https://www.virtualbox.org/wiki/Downloads

* 虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的

2. 安装 Vagrant

下载地址:http://downloads.vagrantup.com/ 根据提示一步步安装。

此外,还得下载官方封装好的基础镜像:
Ubuntu precise 32 VirtualBox http://files.vagrantup.com/precise32.box
Ubuntu precise 64 VirtualBox http://files.vagrantup.com/precise64.box

如果你要其他系统的镜像,可以来这里下载:http://www.vagrantbox.es/

* 鉴于国内网速,我们将下载镜像的步骤单独剥离出来了

3. 添加镜像到 Vagrant

假设我们下载的镜像存放路径是 ~/box/precise64.box,在终端里输入:

$ vagrant box add hahaha ~/box/precise64.box
hahaha 是我们给这个 box 命的名字,~/box/precise64.box 是 box 所在路径

4. 初始化开发环境

创建一个开发目录(比如:~/dev),你也可以使用已有的目录,切换到开发目录里,用 hahaha 镜像初始化当前目录的环境:

$ cd ~/dev  # 切换目录
$ vagrant init hahaha  # 初始化
$ vagrant up  # 启动环境
你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。

$ vagrant ssh  # SSH 登录
$ cd /vagrant  # 切换到开发目录,也就是宿主机上的 `~/dev`
~/dev 目录对应虚拟机中的目录是 /vagrant

Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 等。

5. 其他设置

Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile 的配置文件,可以修改配置文件进行个性化的定制。

Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile,将下面这行的注释去掉(移除 #)并保存:

config.vm.network :private_network, ip: "192.168.33.10"
重启虚拟机,这样我们就能用 192.168.33.10 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

6. 打包分发

当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:

$ vagrant package
打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

7. 常用命令

$ vagrant init  # 初始化
$ vagrant up  # 启动虚拟机
$ vagrant halt  # 关闭虚拟机
$ vagrant reload  # 重启虚拟机
$ vagrant ssh  # SSH 至虚拟机
$ vagrant status  # 查看虚拟机运行状态
$ vagrant destroy  # 销毁当前虚拟机
更多内容请查阅官方文档 http://docs.vagrantup.com/v2/cli/index.html

8. 注意事项

使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:

# Apache 配置添加:
EnableSendfile off

# Nginx 配置添加:
sendfile off;
SegmentFault 团队就是用这种方式统一开发环境的
本篇文章所用程序版本 VirtualBox 4.2.16,Vagrant 1.2.7

延伸阅读:

《Go 语言开发环境配置》 by @Asta谢
Vagrant 启动失败,停留在 Waiting for VM to boot 的解决方法
开启 NFS 文件系统提升 Vagrant 共享目录的性能
vagrant 环境搭建 开发工具
链接 更多
34 推荐   收藏
你可能感兴趣的文章

Vagrant搭建开发环境1--总体介绍 5 收藏,965 浏览
Otto开发初探——微服务依赖管理新利器 2 收藏,315 浏览
Virtualenv + SublimeText 的Python开发环境 12 收藏,1.3k 浏览
讨论区

 
来试试 docker 嘛

#1 yanyaoer · 2013年08月14日 · 回复

 
回复 yanyaoer:
哥,来写篇 docker 的教程如何?

#2 fenbox · 2013年08月14日 · 回复

 
回复 fenbox:
我就在mac上跑了下教程 =.= 没敢用到生产环境

#3 yanyaoer · 2013年08月14日 · 回复

2
昨天看到教程今天在公司推行了一下vagrant,遇到一个很大的坑,用nginx+php的同学要注意了,一定要把 nginx.conf 里的 sendfile off; 否则静态文件会缓存,具体可以看这里 http://stackoverflow.com/questions/9479117/vagrant-virtualbox-apache2-strange-cache-behaviour

#4 skey · 2013年08月16日 · 回复

 
回复 skey:
嗯,我也是这么解决的

#5 fenbox · 2013年08月16日 · 回复

 
@fenbox 抱歉没有仔细看到最后的注意事项,目前我们团队已经用上Vagrant了,针对目前遇到更新配置的问题,期待再讲一课主讲puppet配合Vagrant进行使用的教程

#6 skey · 2013年08月16日 · 回复

 
我在win下用VirtualBox,感觉磁盘io很慢

#7 lidashuang · 2013年08月23日 · 回复

 
回复 lidashuang:
Windows 下不知道有没有开启 NFS 的方法,官方文档说好像不行 http://docs.vagrantup.com/v2/synced-folders/nfs.html

#8 fenbox · 2013年08月23日 · 回复

 
在虚拟机里跑,也可以走断点吗(´・_・`)

#9 KK_Zhang · 2013年09月09日 · 回复

 
回复 KK_Zhang:
有些 IDE,比如 phpstorm,pycharm 这种专门提供了 vagrant 的配置,支持断点

#10 fenbox · 2013年09月09日 · 回复

 
回复 fenbox:
原来如此,解惑了,谢谢

#11 KK_Zhang · 2013年09月09日 · 回复

 
回复 fenbox:
如果队友需要改动box, 比如安装服务器软件, 那么这个重新分发的过程是什么样子的? 你么是用什么方式来使得每个人手上的box是一致的。

#12 zealinux · 2013年09月11日 · 回复

 
回复 zealinux:
如果改动了 box,那就将改动好的 box 得重新打包,其他人用新打包的 box 重定义自己的开发目录即可

#13 fenbox · 2013年09月11日 · 回复

 
厨子,厉害啊!

#14 ikbear · 2013年09月25日 · 回复

 
回复 fenbox:
fenbox 大大,我遇到很奇怪的问题,求解答: 我把环境配好,然后 vagrant package 打包,此时的包已经1.46G,原来干净的是310M。 当我把这包拷到别的机器,vagrant box add ... up.. init 后,配置的环境都没了,连安装包都没了,这是为什么呢?

#15 byends · 2013年11月05日 · 回复

 
安装好了,但vagrant ssh的时候,总是提示超时被拒绝,连接不上.怎么回事?

#16 cfanbo · 2013年11月12日 · 回复

 
回复 byends:
参照vagrant box add hahaha ~/box/precise64.box里的别名hahaha config.vm.box = "base"的base改成hahaha

#17 Lvye · 2013年11月18日 · 回复

 
vagrant可以安装桌面版的xp或者Ubuntu么,我今天试了下,xp的可以安装成功,但是会说启动超时,但在virtualbox看虚拟机是启动了,但是没有弹出可以控制的桌面界面,楼主有经验不?
http://www.vagrantbox.es/这里貌似也没有桌面版的系统

#18 nabilzhang · 2013年12月26日 · 回复

 
vagrant 安装桌面版 XP 有什么意义呢?你可以给 Ubuntu 装个桌面 GUI。不过这完全没必要啊。。。

#19 fenbox · 2013年12月26日 · 回复

 
目的是,我想做一个完全的虚拟开发环境,做个ubuutu桌面版,我要用的eclipse等ide配置好,然后今后我只需要vagrant up在图形化的界面做开发。有其他人加入,他也直接可以使用里面图形化的ide,vagrant适合这种场景么? 我这边也正在package个试试

#20 nabilzhang · 2013年12月27日 · 回复

 
这个还真没试过,vagrant 的初衷就是砍掉 GUI

#21 fenbox · 2013年12月27日 · 回复

 
Vagrant_1.4.3/Vagrant_1.3.5/precise32.box/precise64.box 都试过了
各种不行啊!!!

[default] Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run vagrant up while the
VirtualBox GUI is open.

#22 可可欠神 · 2014年03月03日 · 回复

 
回复 可可欠神:
你以 VirtualBox GUI 形式开启虚拟机看看有没有报错信息?

#23 fenbox · 2014年03月04日 · 回复

 
回复 可可欠神:
这通常是你系统本身或者virtualbox遇到的问题,不是vagrant的问题,更高版本的vagrant会对这个错误做出更清晰的提示。
你可以打开virtulabox然后再运行vagrant up这时候你可以看到更清晰的错误提示。

#24 bandit · 2014年04月30日 · 回复

 
回复 yanyaoer:
windows下没法用

#25 ben_427443 · 2014年05月14日 · 回复

 
回复 可可欠神:
感觉是虚拟机软件有问题吧?
提示虚拟机状态是关机,你装好虚拟机软件后在windows下自己新建一个虚拟机,然后尝试启动和安装系统看看,可以验证一遍。
另外,个人在使用的过程中遇到过32位系统使用64为box的时候无法成功启动的案例。
祝好运

#26 ben_427443 · 2014年05月14日 · 回复

 
在 vagrant up 之前,如果是windows的话,需要将 virtual box 安装路径设置到path中,不然启动将会一直停留在:
Verifying Hyper-V is Enabled

#27 周文滔 · 2014年05月22日 · 回复

 
回复 yanyaoer:
我也是在mac上面跑了跑,似乎性能不是很好。。ssh连接卡卡的。

#28 baocaixiong · 2014年06月18日 · 回复

 
回复 周文滔:
我把virtualbox安装路径加到path里,结果vagrant up一直停留在booting vm...无法启动虚拟机。
把virtualbox路径从path里移除后就好了。

#29 1ambda · 2014年10月03日 · 回复

 
我在cento测试服务器上虚拟了10个box,跑起来还算不错,但是压测的时候,经常出现vagrant变成aborted 状态,疑似网卡的问题,有哪位同学也遇到了么?可以探讨一下。

#30 jawa · 2014年10月03日 · 回复

 
补充(2014/10/03),通常有时候还会导致宿主机无法ssh。

#31 jawa · 2014年10月03日 · 回复

 
回复 skey:
sendfile 竟然和 cache 有关系…………

#32 依云 · 2014年10月04日 · 回复

1
补充(2014/10/14) ,是内存问题,内存跑满了会导致被OS kill掉,加到32G以后问题消失,但是在高IO情况下,还是会造成宿主机down掉。解决中。。。。。

#33 jawa · 2014年10月16日 · 回复

 
已经有Virtualbox这样的虚拟机了,为什么还需要这个Vagrant?

#34 knightuniverse · 2月5日 · 回复

 
回复 knightuniverse:
命令行控制,可以很方便的配置一个新的运行环境,甚至可以给每个项目配置一个运行环境,总之好用,谁用谁知道

#35 gaoshan · 2月6日 · 回复

 
回复 gaoshan:
噢,大概懂了。有点类似于vbox gui的字符界面版。通过提供的一些命令什么的做配置,更新等。

#36 knightuniverse · 2月6日 · 回复

 
安装好了,但vagrant ssh的时候,总是提示超时被拒绝,连接不上.怎么回事?

#37 过往云烟 · 3月8日 · 回复

 
回复 过往云烟:
到网站问答区提个问题附上截图看看? http://segmentfault.com/ask

#38 fenbox · 3月8日 · 回复

 
回复 fenbox:
我开启了 私有IP 用192.168.11.1:22 不行 但是 用 127.0.0.1:2222却是可以连ssh

#39 过往云烟 · 3月8日 · 回复

 
回复 yanyaoer:
vagrant主要配置:
config.vm.provider :virtualbox do |vb|
#vb.gui = true
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
config.vm.network :private_network, ip: "192.168.10.10"

config.vm.synced_folder ".", "/vagrant", type: "nfs" reload时候报错:
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Exporting NFS shared folders...
==> default: Preparing to edit /etc/exports. Administrator privileges will be required...
Password:
==> default: Mounting NFS shared folders...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mount -o 'vers=3,udp' 192.168.10.1:'/Volumes/Data/vagrant-lnmp' /vagrant

Stdout from the command:

Stderr from the command:

mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.

mount.nfs: an incorrect mount option was specified
请教下这个是啥原因 谢谢了

#40 update · 4月17日 · 回复

 
win7下报错,不知道怎么解决

E:\work\dev>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
There was an error while executing VBoxManage, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["list", "hostonlyifs"]

Stderr: VBoxManage.exe: error: Failed to create the VirtualBox object!
VBoxManage.exe: error: Code E_INVALIDARG (0x80070057) - One or more arguments ar
e invalid (extended info not available)
VBoxManage.exe: error: Most likely, the VirtualBox COM server is not running or
failed to start.

#41 uyuyuy · 6月9日 · 回复

 
回复 uyuyuy:
查了下有人有相似的错误,他的解决方法是:

关闭所有的 vagrant 和 virtualbox 进程
去你的用户根目录 (通常是 C:\Users\<username> )
删除 .vagrant.d 和 .Virtualbox 文件
#42 fenbox · 6月9日 · 回复

 
删除了.vagrant.d和.Virtualbox一样的报错

#43 uyuyuy · 6月10日 · 回复

 
@fenbox 请问一下,我用vagrant搭建开发环境 是不是仅限于搭建开发环境中得服务,比如:tomcat、Apache、nginx?一些开发工具,如:eclipse什么的,在没有GUI的前提下,可以放入这个开发环境中,后续安装就可以用了吗?

#44 Crazy_Coder · 6月15日 · 回复

 
回复 Crazy_Coder:
最好是只放开发环境中的服务,eclipse 这种工具还是放在本地环境比较好,效率高。

#45 fenbox · 6月15日 · 回复

 
不错

#46 CalcYu · 6月27日 · 回复

 
请问,Mac平台,每次vagrant up 之后, 执行$ vagrant ssh , 都会报如下错误:
ssh: Could not resolve hostname ubuntu: nodename nor servname provided, or not known

不太理解这是什么,缺少 SSH key? 需要怎么配置吗?
另外, 通过类似putty这样的工具,通过IP,端口,+vagrant用户名,密码, 是可以正常访问virtual box 里 该虚拟机.

补充:
没有修改Vagrantfile文件,其实改过几个,reload之后,发现并不能解决问题.

vagrant ssh 这条命令,是连接虚拟机吧? 还是生成SSH key的?

不知道,我这个问题,可能是出在哪里?麻烦啦.

#47 selfrebuild · 8月14日 · 回复

 
$ vagrant box list
base (virtualbox, 0)
ubuntu (virtualbox, 0)

$ vagrant init "ubuntu"
A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ubuntudefault1439521836720_27993
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...

default: Adapter 1: nat
==> default: Forwarding ports...

default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...

default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection timeout. Retrying...  (这里有个超时.)
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if its present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...

default: /vagrant => /Users/XXXX/iVirtual_OS/Vagrant/dev/ubuntu
补充我执行vagrant的初始化命令,完整的信息.

不太明白是不是跟SSH Key 有关?

#48 selfrebuild · 8月14日 · 回复

 
回复 selfrebuild:
vagrant ssh 其实是用 ssh key 登录 vagrant,跟用户名+密码登录方式一样。你这个问题我粗略搜了一下似乎没找到解决方法?

#49 fenbox · 8月14日 · 回复

 
回复 fenbox:
谢谢回复... 这个问题实在是给跪了...不太明白,为何vagrant up 启动虚拟机之后,他找不到 ssh key, 按说不应该呀...主要是不太明白他找ssh key的 路径, 另外 通过 vagrant ssh-config, 可以看到它是关联到key了,却始终报这个莫名其妙的错误...

$ vagrant ssh-config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/XXXX/vagrant/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL

我是下载的官方的ubuntu14.04的box.按照别人的教程,走到这一步,就莫名其妙了...似乎没人遇到过我这个问题?

另外,你们是在windows下,Linux下配置,执行vagrant ssh,可以正常连接虚拟机?

#50 selfrebuild · 8月14日 · 回复

1
回复 fenbox:
我的问题解决了...并不是vagrant的问题.
我的Mac机用户根目录 /Users/XXX/.ssh目录下,有个错误的config配置文件.(该配置文件,我也不记得是怎么遗留出来的.)
/Users/XXX/.ssh $ ls
authorizedkeys iKey idboot2docker.pub id_rsa.pub
config idboot2docker idrsa known_hosts

而该无效的config文件内容如下:
$ cat config
Host 127.0.0.1
hostname ubuntu
user root

这里不小心把hostname改成ubuntu.导致和vagrant ssh 命令冲突.
之前的报错一直是:
$ vagrant ssh
ssh: Could not resolve hostname ubuntu: nodename nor servname provided, or not known

====================================
解决办法:
删除该config文件,就可以正常使用vagrant ssh连入虚拟机.

$ vagrant ssh
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-45-generic x86_64)

Documentation: https://help.ubuntu.com/
Last login: Thu Feb 12 10:37:57 2015 from 10.0.2.2
vagrant@vagrant:~$ ls
setuptools-12.1.zip

====================================
faint.
这个问题,恐怕会坑死无数人.不记得当初为何配置这个config了.

以后配置vagrant,一定要特别注意检查自己的/Users/XXX/.ssh目录,是否有无效的SSH配置文件.
记得删 删 删 ! ! !

#51 selfrebuild · 8月14日 · 回复

 
回复 selfrebuild:
我们在 windows 和 mac 下配置,连接正常连接。

#52 fenbox · 8月14日 · 回复

 
在vagrant中建的网站在windows下访问速度总是很慢,除去一些复杂的情况,在windows下访问速度快很多,请问该怎么解决

#53 wjh825998772 · 9月2日 · 回复

 
我发现vagrant一个很大的问题,就是node.js的watch功能在虚拟机里并不能侦测到主机进行的编辑,上网查了好半天,说可以用NFS同步文件解决,但是NFS只能用于非windows环境,windows环境还是不行……

#54 HeavyPanzer · 10月28日 · 回复

相关热词搜索:Vagrant

上一篇:在VMWare WorkStation上安装64位操作系统
下一篇:VirtualBox中虚拟XP共享文件夹设置

分享到: 收藏
评论排行
最新发布