你在本地搭建了一个开发环境,可能是为 php 准备的,你在这个本地的开发环境上面做了一个项目,当你把它迁移到真正的服务器上的时候,你发现了一些问题。这很可能是因为你的本地开发环境与服务器的生产环境之间是有区别的。慢慢地,你又想试一下 node ,因为它跟 JavaScript 的关系不错。或者又对 ruby 产生了兴趣,只因为她有个好听的名字。尝试这些你都需要去安装一些软件,去配置它们的运行环境,你越来越发现,管理这些环境可能会是个问题。
Vagrant 可以让你为每个项目都创建一个虚拟机,你可以选择虚拟机运行的操作系统,去配置需要的环境,比如安装 Web 服务器,数据库管理系统等等。项目的目录可以放在你的电脑上,它会跟虚拟机上的一个目录同步。你的电脑与虚拟机之间可以相互访问,所以,你可以像往常一样,用自己喜欢的编辑器去开发 Web 应用,然后用虚拟机上配置好的环境去运行你的项目。使用 Vagrant,你可以在本地电脑上用虚拟机去配置一个跟 Web 应用的生产环境一样的环境,一样的操作系统,一样的软件,一样的配置。你还可以与团队里的其他成员分享你的开发环境,
准备
下载并安装下面这两样东西:
VirtualBox 是一款开源免费的虚拟机软件,跨平台,Windows ,OS X 都可以使用。Vagrant 也是跨平台的。这篇文章里的演示是在 OS X 操作系统下面完成。
box
box 就是虚拟机的镜像,可以在 Vagrant Cloud 里面下载到,你可以选择自己想要的操作系统,这里我要用的是 CentOS 6.5,因为我的网站的生产环境,也打算用 CentOS 6.5 这个操作系统。这里我要用的是:
chef/centos-6.5
回到命令行工具,去把这个 box 下载到本地电脑上,并且添加到 vagrant 里面:
vagrant box add chef/centos-6.5
返回:
==> box: Loading metadata for box 'chef/centos-6.5' box: URL: https://vagrantcloud.com/chef/centos-6.5 This box can work with multiple providers! The providers that it can work with are listed below. Please review the list and choose the provider you will be working with. 1) virtualbox 2) vmware_desktop
因为我们用的是 VirtualBox ,所以,这里应该选择第一个选项,输入数字 1,然后回车。 这样 vagrant 会从 Vagrant Cloud 上下载我们指定的 box 。因为镜像包含操作系统,所以一般都比较大,几百 MB 到 几个 G 都有。
完成以后,输入下面命令来查看可以使用的 box :
vagrant box list
返回:
chef/centos-6.5 (virtualbox, 1.0.0)
现在,就可以用 CentOS-6.5 这个版本的操作系统来运行我们要开发的 Web 应用了。
初始化
打开命令行工具,OS X 上面可以使用系统自带的终端工具,Windows 用户可以用命令提示符工具。然后先为项目创建一个目录,可以放在任何地方。我打算在当前登录用户的桌面上,创建一个叫 ninghao.net 的目录:
cd ~/desktop mkdir ninghao.net
进入到为项目创建的这个目录:
cd ninghao.net
然后执行初始化项目的命令:
vagrant init chef/centos-6.5
上面的命令就是使用之前我们下载并添加的 chef/centos-6.5 这个 box 去初始化一下项目,也就是,我们的项目会运行在 centos 6.5 这个版本的操作系统的虚拟机上。
执行了上面这行命令,会在项目的目录里面,生成一个叫 Vagrantfile 的文件,这个文件告诉了 vagrant 怎么样去运行这个虚拟机。
配置网络
如果你想让你的电脑跟虚拟机之间可以相互通信,比如你在虚拟机上安装了一个 Web 服务器,你打算可以在本地电脑上,或者同一网络内的其它设备可以访问到这台虚拟机上的项目。这需要去做一些配置,有三种方式,端口转发(Forwarded Ports),私有网络(Private Network),公有网络(Public Network)。
下面,我们去配置一个公有网络,也就是,你可以在自己的电脑上通过一个内部的 ip 地址访问到虚拟机,在同一网络内的其它设备,也可以访问到这台虚拟机。
先打开项目目录下面的 Vagrantfile 文件。找到这行代码:
# config.vm.network "public_network"
去掉它前面的 # 号:
config.vm.network "public_network"
保存文件。
启动
配置好网络以后,就可以去启动虚拟机了,确定当前所在的目录是项目的目录,然后执行:
vagrant up
返回:
Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'chef/centos-6.5'... ==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'chef/centos-6.5' is up to date... ==> default: Setting the name of the VM: ninghaonet_default_1404827171486_40050 ==> default: Fixed port collision for 22 => 2222. Now on port 2200. ==> default: Clearing any previously set network interfaces... ==> default: Available bridged network interfaces: 1) en1: Wi-Fi (AirPort) 2) en0: 以太网 3) en4: Thunderbolt 1 4) en3: Thunderbolt 2 5) p2p0 6) bridge0 default: What interface should the network bridge to?
配置好网络以后,第一次启动,会出现上面这样的提示,让我们选择桥接的方式,选择哪个要看你的网络环境。比如我的电脑是在一个小型的局域网里,通过一个无线的路由器上网,所以这里,我选择第一个选项:en1:Wi-Fi(Airport)。输入数字 1,然后按下回车。
==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: bridged ==> default: Forwarding ports... default: 22 => 2200 (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2200 default: SSH username: vagrant default: SSH auth method: private key default: Warning: Connection timeout. Retrying... default: Warning: Remote connection disconnect. Retrying... ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... ==> default: Configuring and enabling network interfaces... ==> default: Mounting shared folders... default: /vagrant => /Users/xiaoxue/Desktop/ninghao.net
ssh
启动以后,我们就可以 ssh 到虚拟机上了。使用命令:
vagrant ssh
这样就可以像操作一般的 Linux 服务器那样,去安装软件,配置等等。宁皓网的《CentOS:在阿里云上运行网站》可以帮助你理解 Linux 系统的基本操作。
注意,在你电脑上的项目的目录,与虚拟机里面的 /vagrant 这个目录是同步的。
安装 nginx
下面,我们在虚拟机上安装一下 nginx 这个 Web 服务器作为演示。在 CentOS 系统上配置一个完整的可以运行 php 的环境,可以参考这篇关于配置阿里云服务器的文章。
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
再执行:
sudo rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
然后用 yum 安装 nginx :
sudo yum install nginx
安装完成以后,可以启动 nginx 服务:
sudo service nginx start
启动了虚拟机上的 nginx 服务以后,在我们的电脑上,或者处在同一网络中的其它设备,就可以访问到这台虚拟机提供的 Web 服务了。不过,首先我们要知道这台虚拟机在内网中的 IP 地址,执行命令:
ifconfig
返回:
eth0 Link encap:Ethernet HWaddr 08:00:27:CE:08:3D inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fece:83d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:596 errors:0 dropped:0 overruns:0 frame:0 TX packets:397 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:61284 (59.8 KiB) TX bytes:50362 (49.1 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:C4:AB:A1 inet addr:192.168.1.104 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fec4:aba1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:11 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1180 (1.1 KiB) TX bytes:1578 (1.5 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
我的电脑在这个局域网里有一个内部的 IP 地址,这个地址是 192.168.1.* ,在这个网络里面的其它的设备,比如 iPhone ,iPad 或者是其它的电脑,它们的内部的 IP 地址都是这样的形式。所以,我可以判断出,eth1 里面的 192.168.1.104 ,应该就是这台虚拟机在内网中的 IP 地址。
在自己的电脑上,打开浏览器,输入 http://192.168.1.104,你应该可以访问到虚拟机提供的 Web 服务。
命令
关掉虚拟机:
vagrant halt
重启虚拟机:
vagrant reload
销毁虚拟机:
vagrant destroy
详细的使用说明,可以查看 vagrant 官方的文档。
更新
2014.07.11
今天跟大伙一起在 qq 群里,测试了一下在 Windows 下面去安装配置 vagrant。我自己也在虚拟机上安装的 Windows 做了测试。大部人都配置成功了,下面总结一下常见的问题。
在为 vagrant 添加 box 的时候,注意系统的版本。如果你的操作系统是 32 位的,那么,你下载的 box 一定也要是 32 位的,在 VagrantCloud 上搜索你想要的 box ,然后选择合适的版本。比如这篇文章里我推荐安装的是 chef/centos-6.5 这个 box ,它就是一个 64 位的系统 。如果你需要 32 位的系统,可以试一下 vagrant init rafacas/centos65-i386-plain 。
在使用 vagrant up ,启动以后,使用 ssh 连接到虚拟机,Windows 用户可以使用 putty ,主机填写 127.0.0.1,端口号是 2222 ,登录的用户名是 vagrant ,密码也是 vagrant 。
在用 vagrant package 打包正在运行的 box 以后,可以添加这个 box ,用 vagrant box add 命令。下次再 init 项目的时候,就可以使用这个 box 了 。在启动的时候,可能会遇到问题,我遇到的问题是由网卡引起的,解决的方法是删除 /etc/udev/rules.d/70-persistent-net.rules 。
2014.08.04
今天发现 nginx 服务器不能同步在本地编辑的静态文件,解决的办法是,编辑 nginx 的配置文件,在 server 或 location 区块里面,添加 sendfile off;
Vagrant
评论
宁兄,博客搞个RSS订阅撒,大家看起来方便,也知道你更新没。
10 年 4 个月 以前
好,试下这个地址:http://ninghao.net/blog/rss
10 年 4 个月 以前
看不到内容全文,只看到标题和简介。
10 年 4 个月 以前
我又修改了一下,您看现在这样行了吗。
10 年 4 个月 以前
rails s就启动web服务了,怎么设置ngnix为服务器?在服务器上Nginx+mongrel部署Rails应用或者nginx + unicorn部署rails项目,这个是什么意思?Nginx不就是服务器吗?为什么还需要mongrel这个服务器?麻烦解答下哈
8 年 8 个月 以前
嘿嘿,抱歉啊,没有用过 rails :)
8 年 8 个月 以前
请问vagrant box add chef/centos-6.5 下载下的box在那里放着?
10 年 4 个月 以前
在用户目录下面的 .vagrant.d 这个目录里面。你可以使用 vagrant box remove 删除掉已经安装好的 box 。在创建项目以后,不需要了,你可以使用 vagrant destroy 销毁掉项目使用的 box 。
10 年 4 个月 以前
用这个IP地址不能访问到index.html这个网页的内容,王老师你说是apache配置的问题,那如何解决呢?
10 年 1个月 以前
你需要自己配置一下 apache 的虚拟主机的功能,参考这个视频:http://ninghao.net/video/534
10 年 1个月 以前
在putty里面怎么粘贴复制呢?
10 年 1个月 以前
复制可以使用快捷键,ctrl + c ,粘贴可以点击右键。
10 年 1个月 以前
皓哥应该讲一下ngnix的重写规则和性能优化。
10 年 1个月 以前
vagrant up引导虚拟机运行时,出现这个GUI问题 运行不下去,解决不了
The guest machine entered an invalid state while waiting for it to boot.valid states are 'starting,running'.The maching is in the 'poweroff' state.Please verify everything is configured properly and try again.
提示打开virtualbox 在up看看这个gui是什么情况,同样的操作在别的机子上可以,不知道哪里错了 怎么改 求助
10 年 4 周 以前
你这个问题解决了吗,我win7系统按视频安装 也是运行vagrant up 出现这个提示
10 年 1 周 以前
换 Win 8.1 吧。
10 年 1 周 以前
我在win7 vagrant 创建的的虚拟机。配置好了服务器后把box 打包后,拿到苹果系统vagrant 下。不能用。初步怀疑是权限的问题。不知道怎么解决?
10 年 1 周 以前
这个还真没试验过,有没有什么提示吗?
10 年 1 周 以前
在我的 pc 上正常。网站可以打开。但是 在mac 上服务器的ngxin,php-fpm , mysql 服务都正常开启运行。就是 网站打不开
10 年 1 周 以前
File not found. 这个提示,虚拟机里centos运行正常的。我在本地也可以ping 到虚拟机里的IP 。 进虚拟机改目录权限也不作用
10 年 1 周 以前
你不能在虚拟机里修改 vagrant 目录的权限,这个目录的拥有者默认是 vagrant ,所以,你可以把 nginx 与 php-fpm 的用户修改成 vagrant 这个用户。
10 年 1 周 以前
我只想学一门课程,可以单独收费吗?
9 年 3 个月 以前
嘿嘿,暂时不行。推荐您订一年,省心了就。
9 年 3 个月 以前
我是初学的,弱弱的问一下,我在centos6下 装的virtualbox为什么不能建64位的虚拟机呢?
9 年 2 个月 以前
是不是这个系统不支持 64 架构呀。您先确定一下自己的电脑支持 64 位的系统。然后去安装使用 centos 7 。
8 年 12 个月 以前
想请教下
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
这个默认2222换2200是什么设置的呢?
9 年 8 小时 以前
这是启动的时候出现的错误吗?影响使用吗?这里说端口有冲突,给你换成了 2200 这个端口,看样子是不是自动为您解决了问题。
8 年 12 个月 以前
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
chown `id -u vagrant`:`id -g vagrant` /vagrant
Stdout from the command:
Stderr from the command:
chown: changing ownership of ‘/vagrant’: Not a directory
皓哥,这个怎么解决
8 年 11 个月 以前
皓哥,
你好,最近公司打算使用vagrant统一开发环境,在部署的时候遇到一个问题,我配置的开发环境打包为package.box文件分发给了团队成员,经测试他们可以正常使用,可是如果后期我又修改了环境配置,如果再打包package.box让团队成员add的话会很繁琐,我想问下可以做到同步吗?也就是我这边配置环境做了修改,其他使用我box的成员开发环境也会做修改。
8 年 6 个月 以前
在win10下运行,会有如下报错。不知道浩哥是否有遇到过?
(我在mac下按上述配置运行是正常的。)
PS E:\vagrant\centos7-1> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.
8 年 6 个月 以前
嗯,在 Windows 上面可能会遇到一些不太确定的问题。没事,我正研究下 Docker ,看看它是不是可以更好的创建开发与生产环境。
8 年 6 个月 以前
确实很期待学习一下Docker这种高大上的技术。哈
8 年 6 个月 以前
I found in another forum that the local Vagrant directory is mounted as "/vagrant" via rsync. This is set in the box itself, you can check by opening
C:\Users\{your_username}\.vagrant.d\boxes\debian-VAGRANTSLASH-jessie64\8.2.2\virtualbox\Vagrantfile
and see the setting
config.vm.synced_folder \
".",
"/vagrant",
type: "rsync"
to get around this I added the following line in my local Vagrantfile
7 年 8 个月 以前
Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available. This filesystem is made available via the VirtualBox Guest Additions and kernel module.Please verify that these guest additions are properly installed in the guest. This is not a bug in Vagrant and is usually caused by a faulty Vagrant box. For context, the command attempted was:
mount -t vboxsf -o uid=900,gid=900 vagrant /vagrant
The error output from the command was:
: No such device
请教这是什么结果导致的呢?
7 年 8 个月 以前
这个问题是VirtualBox版本5.1.16,本身存在的bug,可以更新VirtualBox版本或下载使用VirtualBox5.1.14版本,问题就能解决。
可参考VirtualBox官方的bug库:https://www.virtualbox.org/ticket/16670
7 年 4 个月 以前
为什么打开科学上网的时候就不能使用hosts里面配置的域名访问虚拟机里面的web项目了..... 使用配置的域名会跳转到公网真正的域名地址去 只能使用IP去访问 电脑是windows10 vagrant + Homestead
5 年 9 个月 以前
应该可以配置一下上网,过滤掉本地主机的地址。
5 年 9 个月 以前
就是没有这个配置 (┬_┬) 每次Google的时候都要开启一下 然后再关掉 😂 我在Internet局域网代理里面把虚拟机的ip过滤掉 不使用代理 好像现在可以了 😄
5 年 9 个月 以前
试了几次 完全正常了 在控制面板--interent属性--连接--局域网设置--高级--列外(对于下列字符开头的地址不适用代理服务器) 输入框里面填入hosts里面配置的域名就可以了 填IP不起作用 大神指点一下 这卡了几天的问题一下就解决了 😂 提个小建议 编辑器可以支持Markdown语法吗?
5 年 9 个月 以前