Vagrant 虚拟环境利器

开发环境之痛

软件开发少不了就是开发环境,Web开发对环境的依赖则更大。Web开发中,无论前端还是后端,都少不了与服务器的通信。通常情况,对于前端开发的同学,尤其是Restfull架构大行其道的情况下,前端往往只需要接口文档。不需要在本地再搭建后端服务。现实很残酷,为了接口调试,前端开发往往还需要在本地搭建一个后端服务。当然也有同学喜欢在本地使用代理到远端的开发服务器。不管怎么样,调试的时候还是少不了后端服务。此外,前端又很少知道后端的环境如何搭建。

对于后端,搭建环境虽然不像前端那样迷茫和小心翼翼。可是开发的机器环境和生产部署的环境不一致,往往会出现

代码在我机子上运行没有问题 (But it works on my machine)

为什么push到服务器就跪了。并且每当有新人入职,再配置一遍开发环境也挺闹心的。

为了一劳永逸的解决开发环境,Vagrant应运而生。 当然现在Docker也可以解决类似的问题。

Vagrant 安装

Vagrant可以看成是一个高级的虚拟机桥梁,通过vagrant方便的与虚拟机共享文件。即将宿主机的文件夹映射到虚拟机的文件系统里。还可以映射网络端口,设置通信的私有网络等。vagrant依赖与虚拟机,目前支持的虚拟化方式很多。与Virtualbox、VMware、Docker都能很好的工作。本文使用的环境是 MacOS X 10.11Virtaulebox 5.2.0 Vagrant 1.8.0

在mac下安装vagrant和virtualbox都比较简单,访问官网download安装dmg包安装即可。下载地址为

加载 Vagrant box

下载box镜像

Vagrant可以看成是一个高级的虚拟机镜像管理器。一套完整的环境镜像称之为Box。任何人都可以制作属于自己的box。这个box就是所谓的开发环境,包含系统和相关的软件。由于我们是从零开始,就下载一个官网ubuntu14.04的镜像。除了官网提供了box镜像下载,更多的镜像可以访问这里

添加box镜像

vagrant可以添加不同的box镜像,然后根据这个镜像来创建初始化虚拟环境。使用如下命令添加box

$ vagrant box add ubuntu14 ~/Download/virtualbox.box

ubuntu14是添加之后的box名,可以随意命名。~/Download/virtualbox.box则是之前下载的box镜像。上面的做法是离线添加,vagrant其实也支持在线添加box,只需把box的路径换成官方的box名。类似包管理的方式。

移除box镜像

添加box镜像只需要一次就行,如果不需要了,可以使用如下命令查看box列表和移除box。

$ vagrant box list
ubuntu14 (virtualbox, 0)
$ vagrant box remove ubuntu14

初始化环境

创建虚拟环境

vagrant可以创建不同的box,然后根据box来初始化环境。创建一个ubuntu14的环境。

$ mkdir ~/ubuntu
$ cd ~/ubuntu
$ vagrant init ubuntu14

vagtant init 加上 box 名,就能创建基于该box的环境。init命令执行之后,会在当前目录生成一个Vagrantfile文件。

启动虚拟机

编辑 Vagrantfile 文件,配置共享文件夹和私有网络访问:

# -*- mode: ruby -*-
# vi: set ft=ruby :

configure

Vagrant.configure(2) do |config|
  ...

  # 配置私有网络
  config.vm.network "private_network", ip: "192.168.33.10"

  # 将当前vagrant环境的目录映射到虚拟机里的 /vagrant,并指定nfs共享。
  config.vm.synced_folder ".", "/vagrant", :nfs => true

  ...
end

有一些vagtant的box或者宿主机并不支持nfs共享,需要安装如下包:

宿主linunx:

$ sudo apt-get install nfs-kernel-server nfs-common 

虚拟机:

$ sudo apt-get install nfs-common

当然,后者命令的执行,必须先启动虚拟机,才能执行安装嘛。启动虚拟机很简单,运行:

$ vagrant up

虚拟机将会启动,一堆配置输出,中途需要授权设置虚拟机的密码。如果在设置mount 共享文件夹出现如下错误:

Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant

可能就是需要给虚拟机安装nfs-common

登录虚拟机

vagrant和宿主机会在虚拟机启动的时候生成 ssh相关的配置。可以直接使用ssh登录虚拟机:

$ vagrant ssh

登录虚拟机之后,可以执行刚才的安装 nfs-common。然后重启虚拟环境即可。

$ vagrant reload

任何修改了Vagrantfile文件的配置,都需要reload虚拟环境才能生效。

加下来,查看虚拟环境的/vagrant将会看见该文件夹下也有一个Vagrantfile文件。并且在该文件夹创建的文件,都将在宿主机和虚拟环境一模一样,两个文件夹实现了nfs共享。

关闭和销毁虚拟环境

当不需要使用虚拟环境的时候,可以使用如下命令关闭虚拟机

$ vagrant halt

关闭之后可以使用vagrant up再一次启动虚拟机。当不需要该环境的时候,可以使用vagrant destroy 销毁虚拟机。

登录虚拟机,安装nginx,然后访问192.168.10.33,即可看见宿主主机访问虚拟环境啦

在虚拟机中安装nginx

$ sudo apt-get install nginx

在宿主机访问192.168.10.33即可看见nginx处理的请求。

打包

创建了虚拟环境之后,这个环境就可以模拟生产环境进行部署web应用程序。然后打包这个环境成为新的box。

$ vagrant package --output new_ubuntu14.box --vagrantfile Vagrantfile

再分发给不同的人,当他们也安装了vagrant和virutalbox,就能依次创建一个box,并初始化和生产环境一致的开发环境啦。

推荐阅读更多精彩内容