20200410212445

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工具。 

20200410214826

  • 我们添加一个虚拟机,vagrant box add 。我这里把镜像文件放在wamp64下面的。

https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

20200410214842

  • 添加完之后,我们在查看当前的虚拟机,即可看到我们方才添加的虚拟机 vagrant box list

20200410215029

  • 初始化虚拟机 vagrant init centos7。

20200410215214

  • 此时我们查看vagrant目录下面就会多一个名为Vagrantfile的配置文件。

(这个配置文件主要后期我们在对虚拟做修改时,直接修改该文件。)

20200410215241

  • 开启虚拟机 vagrant up

20200410215609
日志解释

  • 这时候看 VirtualBox,就能发现多了一台虚拟机(并且在运行中)

20200410215657
所在目录将生成.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安装完成后,默认存放虚拟机镜像文件的位置在系统盘,建议存储在其他磁盘下,具体步骤如下:

  1. 打开VirtualBox,打开管理-> 全局设置 (快捷键是 Ctrl-G )
  2. 选择 常规 里的 默认虚拟电脑位置(M)
  3. 设置为非系统盘的位置

配置vagrant的镜像存储位置

vagrant对于虚拟机的管理分成两个部分:box和Machine

  • box是指初始的未部署的虚拟机镜像文件,这个文件相当于是虚拟机的一个模板,可以进行无限制次数的复制
  • Machine指处于可运行状态下的虚拟机

当使用 vagrant 添加 box(vagrant add)时,对于windows用户,vagrant会默认将这些虚拟机模板镜像文件存放在 c:\User\.Vagrant.d 文件夹下,<mark>当使用vagrant添加的box文件较多时,这个目录将会变得非常大,建议转移到其他磁盘分区</mark>

20200413120252

具体步骤如下:

  • c:\User\.vagrant.d 目录移动到新的位置
  • 设置VAGRANT_HOME 环境变量指向新的位置

windows用户设置:


注:若在后续操作中发现设置未生效,尝试重启电脑让新加入的环境变量生效。
或者查看是否配置成功
20200413120841

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)

  1. 定义
    端口转发指把宿主机的端口映射到虚拟机的某一个端口上,访问宿主机端口时,请求实际是被转发到虚拟机上指定端口的。
    注:宿主机指运行虚拟机的物理机。
  2. 优点
    容易实现外网访问虚拟机
  3. 缺点
    <mark>如果端口较少需要映射很容易,但是端口比较多时,就比较麻烦</mark>,例如:MySQL,redis,nginx等服务。
    不支持在宿主机使用小于1024的端口来转发,例如:不能使用SSL的443端口来进行https连接。
  4. 配置
    在配置文件Vagrantfile下做如下编辑
    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
    
    注:若guest_ip和host_ip两项配置为空,则局域网下的所有设备都可以访问该虚拟机。
    示例配置,如下
    Vagrant.configure("2") do |config|
      config.vm.network "forwarded_port", guest: 80, host: 8080,
        auto_correct: true
    end
    

私有网络(private networks)

  1. 定义
    私有网络是指只有宿主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问。
  2. 优点
    安全,只有自己可以访问
  3. 缺点
    团队成员不能访问你的虚拟机
  4. 配置
    配置如下:
    config.vm.network 
                    "private_network"//必须 ,私有网络标识
                    , ip: "192.168.33.10"
    
    注:私有ip可以自行指定

公有网络(public networks)

  1. 定义
    公有网络是指设置虚拟机和宿主机有相同的网络配置。

  2. 优点
    方便团队协作,别人可以访问你的虚拟机

  3. 缺点
    只有在有网络的情况下才能访问虚拟机

  4. 配置

    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/

参考: