Vagrant是一款用来构建虚拟开发环境的外挂工具,可以简化虚拟机配置和管理。它底层支持VirtualBox、VMware、AWS等,非常适合使用php/python/ruby/java语言开发web应用,“代码在我机子上运行没有问题”这种说辞将成为历史。
安装VirtualBox
去官网 https://www.virtualbox.org/wiki/Downloads 下载最新版的Virtualbox,然后双击安装,一直点击确认完成。
安装Vagrant
去官网 https://www.vagrantup.com/downloads.html 下载最新版的Vagrant,然后双击安装,一直点击确认完成。在windows下安装vagrant,为了写入相应配置到环境变量,系统可能会要求重新启动。在命令行中,输入vagrant,查看程序是不是已经运行了。如果不行,请检查一下$PATH里面是否包含vagrant所在的路径
准备box
接下来,我们需要选择使用何种操作系统,这里以centos7.2为例。以前基于虚拟机的工作流,我们需要下载ISO镜像,安装系统,设置系统等操作。而Vagrant开源社区提供了许多已经打包好的操作系统,我们称之为box。你可以从box下载地址(下文列出),找到你想要的box,当然你也可以自己制作一个。
官方仓库:https://atlas.hashicorp.com/boxes/search
官方镜像:https://vagrantcloud.com/boxes/search
第三方仓库:http://www.vagrantbox.es/(国内)
使用案例
-
安装virtualbox,vagrant直接按照平常安装软件一样即可。
-
安装好后,进入磁盘目录,任意磁盘都行,创建一个管理目录。这里以vagrant目录为例。同时推荐终端工具不适用windows自带的dos,这里推荐xshell工具。
- 我们添加一个虚拟机,vagrant box add 。我这里把镜像文件放在wamp64下面的。
https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
- 添加完之后,我们在查看当前的虚拟机,即可看到我们方才添加的虚拟机 vagrant box list
- 初始化虚拟机 vagrant init centos7。
- 此时我们查看vagrant目录下面就会多一个名为Vagrantfile的配置文件。
(这个配置文件主要后期我们在对虚拟做修改时,直接修改该文件。)
- 开启虚拟机 vagrant up
日志解释
- 这时候看 VirtualBox,就能发现多了一台虚拟机(并且在运行中)
所在目录将生成.vagrant文件夹,如下:
命令详解
虚拟机管理
命令 | 作用 |
---|---|
vagrant box add [box_name] [box_path] | 添加box的操作 |
vagrant init | 初始化box的操作,会生成vagrant的配置文件Vagrantfile |
vagrant up [vm_name] | 启动指定环境 (默认为本地) 0. (默认)在VirtualBox上启动 1. 在vmware上: vagrant up –provider=vmware_fusion [vm_name] 2. 在AWS上: vagrant up –provider=aws [vm_name] |
vagrant ssh [vm_name] | 通过ssh登录指定环境所在虚拟机(默认为本地) 通常情况下,vagrant在创建虚拟机的时候,内置了1个用户: username: vagrant password: vagrant |
vagrant halt [vm_name] | 虚拟机关闭 (默认为本地) |
vagrant suspend [vm_name] | 虚拟机挂起 (默认为本地) |
vagrant resume | 恢复本地环境 |
vagrant reload [vm_name] | 虚拟机重启 (默认为本地) 修改了Vagrantfile后,使之生效(相当于先 halt,再 up) |
vagrant destroy [vm_id] | 彻底销毁虚拟机 (默认销毁本地) <mark>虚拟机删除后,所有在虚拟机中做的改动都不再存在,慎用。</mark> |
vagrant box list | 显示当前已经添加的box列表 |
vagrant box remove [box_name] | 删除相应的box |
vagrant package | 打包命令,可以把当前的运行的虚拟机环境进行打包 |
vagrant plugin | 用于安装卸载插件 |
vagrant status | 获取当前虚拟机的状态 |
vagrant global-status | 显示当前用户Vagrant的所有环境状态 |
快照管理
命令 | 作用 |
---|---|
vagrant snapshot save your_snapshot_name | 新建快照 |
vagrant snapshot list | 查看快照 |
vagrant snapshot restore your_snapshot_name | 恢复快照 |
vagrant snapshot delete your_snapshot_name | 删除快照 |
配置镜像位置
配置VirtualBox的镜像文件存放位置
vagrant和VirtualBox安装完成后,默认存放虚拟机镜像文件的位置在系统盘,建议存储在其他磁盘下,具体步骤如下:
- 打开VirtualBox,打开管理-> 全局设置 (快捷键是 Ctrl-G )
- 选择 常规 里的 默认虚拟电脑位置(M)
- 设置为非系统盘的位置
配置vagrant的镜像存储位置
vagrant对于虚拟机的管理分成两个部分:box和Machine
- box是指初始的未部署的虚拟机镜像文件,这个文件相当于是虚拟机的一个模板,可以进行无限制次数的复制
- Machine指处于可运行状态下的虚拟机
当使用 vagrant 添加 box(vagrant add)时,对于windows用户,vagrant会默认将这些虚拟机模板镜像文件存放在 c:\User\.Vagrant.d
文件夹下,<mark>当使用vagrant添加的box文件较多时,这个目录将会变得非常大,建议转移到其他磁盘分区</mark>
具体步骤如下:
- 将
c:\User\.vagrant.d
目录移动到新的位置 - 设置VAGRANT_HOME 环境变量指向新的位置
windows用户设置:
注:若在后续操作中发现设置未生效,尝试重启电脑让新加入的环境变量生效。
或者查看是否配置成功
MAC用户设置:
export VAGRANT_HOME='新位置路径'
配置详解
共享文件夹配置
vagrant提供了将本机目录挂载到虚拟机目录下的功能,默认是将vagrant配置文件所在目录挂载到虚拟机/vagrant目录下。
打开配置文件Vagrantfile,找到如下配置项:
config.vm.synced_folder
配置项如下:
config.vm.synced_folder
"your_folder"(必须) //物理机目录,可以是绝对地址或相对地址,相对地址是指相对与vagrant配置文件所在目录
,"vm_folder(必须)" // 挂载到虚拟机上的目录地址
,create(boolean)--可选 //默认为false,若配置为true,挂载到虚拟机上的目录若不存在则自动创建
,disabled(boolean):--可选 //默认为false,若为true,则禁用该项挂载
,owner(string):'www'--可选 //虚拟机系统下文件所有者(确保系统下有该用户,否则会报错),默认为vagrant
,group(string):'www'--可选 //虚拟机系统下文件所有组( (确保系统下有该用户组,否则会报错),默认为vagrant
,mount_options(array):["dmode=775","fmode=664"]--可选 dmode配置目录权限,fmode配置文件权限 //默认权限777
,type(string):--可选 //指定文件共享方式,例如:'nfs',vagrant默认根据系统环境选择最佳的文件共享方式
例子
config.vm.synced_folder
"D:/www/code"
, "/code"
, owner:"www"
, group:"www"
,create:true
,mount_options:["dmode=775","fmode=664"]
config.vm.synced_folder ".","/vagrant",disabled:true //禁用vagrant的默认共享目录
网络配置
vagrant提供了三种网络配置方式:端口转发(默认)、私有网络、公有网络,可以在 配置文件 Vagrantfile
进行网络配置,<mark>推荐使用私有网络</mark>。
端口转发(forwarded ports)
- 定义
端口转发指把宿主机的端口映射到虚拟机的某一个端口上,访问宿主机端口时,请求实际是被转发到虚拟机上指定端口的。
注:宿主机指运行虚拟机的物理机。 - 优点
容易实现外网访问虚拟机 - 缺点
<mark>如果端口较少需要映射很容易,但是端口比较多时,就比较麻烦</mark>,例如:MySQL,redis,nginx等服务。
不支持在宿主机使用小于1024的端口来转发,例如:不能使用SSL的443端口来进行https连接。 - 配置
在配置文件Vagrantfile下做如下编辑
注:若guest_ip和host_ip两项配置为空,则局域网下的所有设备都可以访问该虚拟机。Vagrant.configure("2") do |config| config.vm.network "forwarded_port"(必须) //端口转发标识 , guest(必须): //虚拟机端口 , host(必须): //宿主机端口,值必须大于1024 ,guest_ip(可选): //虚拟机端口绑定虚拟机ip地址 ,host_ip(可选): //虚拟机端口绑定宿主机ip ,protocol(可选)://指定通信协议,可以使用tcp/udp,默认tcp ,auto_correct(可选)://true/false,若配置为true,则每次开启虚拟机的时候自动检查是否存在端口冲突 end
示例配置,如下Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true end
私有网络(private networks)
- 定义
私有网络是指只有宿主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问。 - 优点
安全,只有自己可以访问 - 缺点
团队成员不能访问你的虚拟机 - 配置
配置如下:
注:私有ip可以自行指定config.vm.network "private_network"//必须 ,私有网络标识 , ip: "192.168.33.10"
公有网络(public networks)
-
定义
公有网络是指设置虚拟机和宿主机有相同的网络配置。 -
优点
方便团队协作,别人可以访问你的虚拟机 -
缺点
只有在有网络的情况下才能访问虚拟机 -
配置
Vagrant.configure("2") do |config| config.vm.network "public_network" //必须 公有网络标识 ,ip(string): //可选,配置静态ip ,bridge(string/array): "en1: Wi-Fi (AirPort)"//可选,设置桥接的网卡 end
Vagrant 中文文档:http://tangbaoping.github.io/vagrant_doc_zh/v2/
参考: