使用Vagrant搭建本地虚拟机开发环境
本地使用Vagrant搭建开发环境
搭建虚拟机开发环境
在不使用docker开发环境的场景下,如果想在个人电脑上安装虚拟机来搭建开发/测试环境,Vagrant 是一个不错的选择。
软件安装
由于Vagrant是使用VirtualBox的基本环境,所以也需要安装VirtualBox
安装VirtualBox
进入 VirtualBox 的主页,点击大大的下载按钮,即可进入下载页面。
VirtualBox 是一个跨平台的虚拟化工具,支持多个操作系统,根据自己的情况选择对应的版本下载即可。
注意,除了主程序,还要把对应的扩展包程序也一并下载了。有些高级特性,比如 USB 3.0 等需要扩展包的支持。

在安装完主程序后,直接双击扩展包文件即可安装扩展包。
安装Vagrant
在 Vagant 网站下载最新的版本,根据自己的操作系统选择对应的版本下载即可。
注意,Vagrant 是没有图形界面的,所以安装完成后也没有桌面快捷方式。具体使用方法,接下来会详细说明。
Vagrant 的安装程序会自动把安装路径加入到 PATH 环境变量,所以,这时候可以通过命令行执行 vagrant version 检查是否安装成功:
C:\Users\Administrator>vagrant version
Installed Version: 2.3.4
Latest Version: 2.3.4
You're running an up-to-date version of Vagrant!
软件配置
配置VirtualBox
虚拟机存放位置
VirtualBox安装之后需要打开软件,配置虚机的存放位置,尽量放在一个空间较大的位置

配置Vagrant
虚拟机镜像文件存放位置
通过 Vagrant 创建虚机需要先导入镜像文件,也就是 box,它们默认存储的位置在用户目录下的 .vagrant.d 目录下,对于 Windows 系统来说,就是 C:\Users\用户名.vagrant.d。
如果后续可能会用到较多镜像,或者你的 C 盘空间比较紧缺,可以通过设置环境变量 VAGRANT_HOME 来设置该目录。
在 Windows 系统中,可以这样操作:新建系统环境变量,环境变量名为 VAGRANT_HOME,变量值为 E:\VirtualBox.vagrant.d

注意,最后这个 .vagrant.d 目录名称不是必须的,但是建议保持一致,这样一眼看上去就能知道这个目录是做什么用处的了。
下载虚机镜像
使用 Vagrant 创建虚机时,需要指定一个镜像,也就是 box。开始这个 box 不存在,所以 Vagrant 会先从网上下载,然后缓存在本地目录中。
Vagrant 有一个镜像网站,里面列出了都有哪些镜像可以用,并且提供了操作文档。
但是这里默认下载往往会比较慢,所以下面我会介绍如何在其它地方下载到基础镜像,然后按照自己的需要重置。如果网速较好,下载顺利的朋友可以选择性地跳过部分内容。
下面我给出最常用的两个 Linux 操作系统镜像的下载地址:
CentOS
CentOS 的镜像下载网站是: http://cloud.centos.org/centos/
在其中选择自己想要下载的版本,列表中有一个 vagrant 目录,里面是专门为 vagrant 构建的镜像。选择其中的 .box 后缀的文件下载即可。这里可以使用下载工具,以较快的速度下载下来。
这里我们选择下载的是 CentOS 7 的最新版本
Ubuntu
Ubuntu 的镜像下载网站是: http://cloud-images.ubuntu.com/
同样先选择想要的版本,然后选择针对 vagrant 的 .box 文件即可。
如果这里官网的速度较慢,还可以从 清华大学的镜像站 下载。
下面的例子以 CentOS 7 为例,使用其它版本操作系统的也可以参考。
添加Box
接下来我们需要将下载后的 .box 文件添加到 vagrant 中。
Vagrant 没有 GUI,只能从命令行访问,先启动一个命令行,然后执行:
E:\VirtualBox VMs\centos7>vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.
提示现在还没有 box。如果这是第一次运行,此时 VAGRANT_HOME 目录下会自动生成若干的文件和文件夹,其中有一个 boxes 文件夹,这就是要存放 box 文件的地方。
执行 vagrant box add 命令添加 box:
C:\Users\Administrator\Downloads>vagrant box add E:\迅雷下载\CentOS-7.box --name centos-7
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos-7' (v0) for provider:
box: Unpacking necessary files from: file:///E:/%D1%B8%C0%D7%CF%C2%D4%D8/CentOS-7.box
box:
==> box: Successfully added box 'centos-7' (v0) for 'virtualbox'!
命令后面跟着的是下载的文件路径,并且通过 --name centos-7 为这个 box 指定一个名字。
后面创建虚机都需要指定这个名字,所以尽量把名字取得简短一点,同时也要能标识出这个镜像的信息(我们后面会定制自己的基础镜像,所以这里可以简单点)。
再次查询,可以看到有了一个 box:
C:\Users\Administrator\Downloads>vagrant box list
centos-7 (virtualbox, 0)
Vagrant 基本操作
新建虚拟机
在目标的虚拟机目录,执行 vagrant init:
E:\VirtualBox\centos7>vagrant init centos-7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
其中的 centos-7 就是我们要使用的 box 名字。
这个命令只是为我们生成一个 Vagrantfile,所以,这里的名字没指定或者写错了都没关系,后面会介绍如何编辑这个 Vagrantfile 来修改。
启动虚机
我们等会再来细看这个文件,现在直接按照提示执行 vagrant up:
E:\VirtualBox\centos7>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos-7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: centos7_default_1681572773071_64427
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: No guest additions were detected on the base box for this VM! Guest
default: additions are required for forwarded ports, shared folders, host only
default: networking, and more. If SSH fails on this machine, please install
default: the guest additions and repackage the box to continue.
default:
default: This is not an error message; everything may continue to work properly,
default: in which case you may ignore this message.
==> default: Rsyncing folder: /cygdrive/e/VirtualBox/centos7/ => /vagrant
正常的情况下,不到一分钟应该就能启动成功了。
注意到这里包含的信息:
虚机名称:centos7_default_1681572773071_64427(可以指定)
网卡:Adapter 1: nat,第一块网卡,NAT 模式,这是固定的
端口转发:22 (guest) => 2222 (host) (adapter 1),把虚机的 22 端口,映射到宿主机的 2222 端口上,这样就可以通过 127.0.0.1:2222 访问虚拟机了(如果本机的端口被其他程序占用,那就修改这个端口即可)
SSH 用户名:vagrant,这里使用 private key 登录
密码也是 vagrant,但是密码方式仅供直接登录,是不能通过 SSH 登录的。
查看虚拟机状态
这里使用了git的bash来运行命令vagrant status
$ vagrant status
Current machine states:
default running (virtualbox)
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
连接虚机
如果启动没问题,接下来执行 vagrant ssh 就能以 vagrant 用户直接登入虚机中。
root 用户没有默认密码,也不能直接登录。需要 root 权限的命令可以通过在命令前添加 sudo 来执行,也可以执行 sudo -i 直接切换到 root 用户。
$ vagrant ssh
[vagrant@localhost ~]$ sudo -i
[root@localhost ~]#
这时候打开 VirtualBox 程序,可以看到自动创建的虚机:

我们也可以在 VirtualBox 的终端上登录系统,默认的登录用户名和密码都是 vagrant。
当然还可以使用其它的 SSH 连接工具例如 XShell,SecureCRT 连接,但是这里默认网卡使用的是 NAT 模式,没有指定 IP,实际应用并不方便,我们在后面介绍网络配置时再详细介绍如何连接虚拟机。
停止虚拟机
执行vagrant halt可以关闭虚机:
$ vagrant halt
==> default: Attempting graceful shutdown of VM...
直接在 VirtualBox 上关闭虚机,或者直接在虚机内部执行 poweroff 命令也都是可以的。
暂停虚机
执行下面的命令可以暂停虚机:
$ vagrant suspend
恢复虚机
执行下面的命令把暂停状态的虚机恢复运行:
$ vagrant resume
注意: 不管虚机是关闭还是暂停状态,甚至是 error 状态,都可以执行 vagrant up 来让虚机恢复运行。
重载虚机
执行下面的命令会重启虚机,并且重新加载 Vagrantfile 中的配置信息:
$ vagrant reload
删除虚机
最后,执行下面的命令可以彻底删除虚机,包括整个虚机文件:
$ vagrant destroy
注意: 在当前这个小例子中,上面所有的 vagrant 命令都需要在 Vagrantfile 所在的目录下执行。