标签归档:vagrant

使用Vagrant构建本地开发环境

首先安装VirtualBox(https://www.virtualbox.org) 和 Vagrant(https://www.vagrantup.com)。

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。简单来说,Vagrant基于一个虚拟机的(虚拟机运行环境可以是VirtualBox,也可是VMWare),并在它之上,根据自定义配置,构建开发环境,比如:宿主机和虚拟机的文件共享,站点配置,建立数据库等。一般是先安装一个虚拟操作系统,上面安装好必须的应用软件(如Nginx、MySQL、PHP等),然后按照格式打包成一个Box(Vagrant的称呼),Vagrant与VituralBox或VMWare进行交互,根据配置配置把Box还原为一个具体的虚拟机,这些是这个工具主要的工作内容。

操作Vagrant有如下几个步骤:
1 添加Box
Vagrant安装之后,会在~目录中生成.vagrant.d文件夹,里面的boxes是已经添加到Vagrant的box,tmp中是下下载box时的临时文件,如果下载box失败,可以到这里删除临时文件。

#https://atlas.hashicorp.com/laravel/boxes/homestead
vagrant box add laravel/homestead

vagrant-box-search

vagrant-box-laravel-homestead
由于已知原因,这样可以成功的几率很低。所以,我们需要离线下载。比如上面的laravel/homestead跳出的URL是:

https://atlas.hashicorp.com/laravel/boxes/homestead/versions/1.1.0/providers/virtualbox.box

然后用代理下载。下载完毕后得到文件,比如叫homestead-virtualbox.box,由于box是有版本的,而离线下载的情况,box的元数据丢失了,所以需要在homestead-virtualbox.box同类目下建立一个叫metadata.json的文件:

{
    "name": "laravel/homestead",
    "versions": [{
        "version": "1.1.0",
        "providers": [{
            "name": "virtualbox",
            "url": "file://homestead-virtualbox.box"
        }]
    }]
}

然后运行vagrant add metadata.json,这样就跟在线添加box是一样的了。如果直接运行vagrant box add homestead-virtualbox.box,在vagrant中是无法启动的,进入~/.vagrant.d\boxes\laravel-VAGRANTSLASH-homestead查看就很明白,它是根据版本号来存放的。

#查看已经添加的box
vagrant box list

laravel/homestead (virtualbox, 1.1.0)

后面的virtualbox表明这个box是使用VirtualBox来运行的,1.1.0表示这个盒子的版本。

2 在工作目录下生成启动文件
进入到具体的工作目录,运行vagrant init laravel/homestead,就会在当前目录下生成Vagrantfile文件,它需要启动的就是之前添加的laravel/homestead这个box,Vagrantfile是一个简单的Ruby脚本,是很容易看懂的。Vagrantfile文件可以读入一个配置文件,也可以把配置直接全部写入Vagrantfile

3 启动
启动文件Vagrantfile建立好后,在当前工作目录下运行vagrant up就可以启动。这个命令会搜索当前目录下的Vagrantfile,如果找不到则会到~目录寻找Vagrantfile。Box启动时,会在和Vagrantfile相同的目录下生成一个.vagrant目录,里面保存了启动后相关的文件,box消毁后会自动删除相关文件。

如果把所有文件都硬编码到Vagrantfile,明显不是最佳实践,所以一般都会把配置提取到一个外部的配置文件,配置文件格式和位置就完全取决Vagrantfile能不能以及如何处理。

只要找到Vagrantfile,并且指定的box存在,box就可以启动。但是Vagrantfile可以配置的参数实际是很多的,所以最好是在Vagrantfile实现编程,把外部的文件读取进来,然后传递给Vagrant让其启动Box。Laravel为其提供的laravel/homestead盒子对应了一个项目()https://github.com/laravel/homestead),说实在的,这个项目仅仅提供了一段Ruby脚本而已(提供Vagrantfile,核心是scripts/homestead.rb),直接克隆下来:

#也可以直接下在Zip包
git clone https://github.com/laravel/homestead.git Homestead

#然后运行init脚本
init 

这个脚本实际就仅仅拷贝几个文件(作为模子),怪胎就在于,它跑到~目录下生成.homestead目录,拷贝进去的文件是after.sh, aliases, Homestead.yaml。主要就是这个Homestead.yaml文件,在其提供的Vagrantfile的文件中(它实现了编程),会读入这个配置文件,所以只需要修改这个配置文件即可:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

name: homestead

keys:
    - ~/.ssh/id_rsa

folders:
    - map: E:/var/www
      to: /home/vagrant/www

sites:
    - map: ebt.app
      to: /home/vagrant/www/ebt/public
    - map: elc.app
      to: /home/vagrant/www/elc/public

databases:
    - ebt

更多的参数,参考scripts/homestead.rb就可以很容易提取出来。不过这里提一下SSH的配置,它把~/.ssh/id_rsa.pub这个公钥塞进到Linux的vagrant用于的home目录中,换句话说就是,本机需要配置了RSA秘钥对:

#
ssh-keygen -t rsa -C "you@homestead"

所以,box启动后可以直接使用本地私钥ssh到其中(ip:192.168.10.10, port:22, user:vagrant)。另外,box启动后也会动态的产生一个RSA秘钥对,并且这个公钥也会塞进vagrant用户,所以也可以使用这个动态产生的RSA秘钥对登录,只是机器销毁后这个秘钥对也会被删除,重启后又产生新的,多少有点不方便。

另外关于端口映射,比如8000转发到 80,实际就是把本机(127.0.0.1)的8000端口转发到客户机(192.168.10.10)的80端口上,看起来是虚拟机层次提供的实现。所以域名可以直接绑定到127.0.0.1,只是在端口号上要处理一下。