开发过程中,本地运行正常,到了测试环境却出了问题,有时就是环境配置不一致造成的。在本地虚拟机中搭建一套接近线上配置的环境,能减少这类问题。

不过,让团队里每个人都手动安装系统、配置软件,还是挺费事的。Vagrant 可以通过命令行管理虚拟机,用同一份 Vagrantfile 配置环境,也可以把准备好的环境打包成 box,分发给其他人使用。

这里使用 Vagrant 2.0.2、VirtualBox 和 CentOS 7。

安装 Vagrant 和 VirtualBox

我选择 Vagrant + VirtualBox 这个组合,主要是 VirtualBox 开源免费,Vagrant 对它的支持也比较早。

先下载安装包:

VirtualBox 需要选择 Vagrant 2.0.2 支持的版本,这里使用 5.2 系列。双击安装包,按提示完成安装,然后在终端执行:

vagrant --version

查看已安装版本:

Vagrant 2.0.2

创建 CentOS 7 虚拟机

在用户目录下建一个目录,存放这台虚拟机的配置:

mkdir -p ~/Vagrant/centos7
cd ~/Vagrant/centos7
vagrant init centos/7
vagrant up --provider=virtualbox

vagrant init 会生成 Vagrantfile;vagrant up 启动虚拟机,本地没有对应 box 时会先下载。

下载比较慢时,也可以先从 CentOS box 的发布页面取得 VirtualBox 版本的下载地址,单独下载。例如下载文件保存为 ~/Downloads/centos7.box,再添加到本地:

vagrant box add --name centos/7 ~/Downloads/centos7.box
vagrant box list
vagrant up --provider=virtualbox

这是前面自动下载的另一种做法。目录中已经有 Vagrantfile,就不用再执行一次 vagrant init。

启动完成后,登录虚拟机:

vagrant ssh

修改 Vagrantfile

在 Mac 上编辑刚才生成的 Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "centos7"

  config.vm.network "private_network", ip: "192.168.56.10"

  config.vm.synced_folder "./data", "/vagrant_data", type: "rsync"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = 3072
    vb.cpus = 2
  end
end

Vagrant.configure("2") 中的 2 是 Vagrantfile 的配置格式版本,不是 Vagrant 软件版本。config.vm.box 指定 box,config.vm.hostname 设置虚拟机的主机名。

网络配置

VirtualBox 下默认的 NAT 网卡用于虚拟机访问外部网络。这里另外增加一个 private_network,通过 host-only 网络让 Mac 和虚拟机互相访问,不直接把虚拟机接入局域网。

192.168.56.10 是示例地址。选择私网网段即可,但要避开 Mac 当前局域网、VPN 和其他虚拟网络已经使用的网段,避免路由冲突。

如果需要让虚拟机像局域网中的独立机器一样被其他设备访问,可以使用桥接网络,对应 Vagrant 的 public_network。本例只做本地开发,用 private network 就够了。

同步目录

这个 CentOS box 的启动日志中可以看到:

==> default: Rsyncing folder: .../centos7/ => /vagrant

这里采用的是 rsync,同步方向是从 Mac 到虚拟机。上面的配置另外把项目中的 data 目录同步到虚拟机的 /vagrant_data。

先在 Mac 的项目目录中创建它:

mkdir -p data

启动或 reload 时会同步一次。修改 Mac 上的文件后,可以手动同步:

vagrant rsync

也可以另开一个终端,在同一项目目录运行:

vagrant rsync-auto

它会监听本地文件变化并自动同步。虚拟机里新生成的文件不会反向同步到 Mac,所以不能靠这个目录把虚拟机日志传回来。rsync 默认还会删除目标目录中源目录没有的文件,不要把虚拟机中要保留的数据放进这个同步目标目录。

如果要使用 VirtualBox 的共享文件夹,需要虚拟机中安装兼容的 Guest Additions,并把同步类型设为 virtualbox;这和日志里的 rsync 是两种方式。

内存和 CPU

vb.memory = 3072 设置 3072 MB 内存,vb.cpus = 2 设置两个虚拟 CPU,可以按 Mac 的资源调整。

保存配置后,在 Mac 的项目目录执行:

vagrant reload
vagrant ssh

进入虚拟机检查主机名、网卡和资源:

hostname
ip addr
free -m
nproc
ls /vagrant_data

常用命令

下面这些命令都在 Mac 上、Vagrantfile 所在目录执行:

命令作用
vagrant up启动虚拟机
vagrant ssh通过 SSH 登录虚拟机
vagrant halt关闭虚拟机
vagrant reload重启虚拟机并重新加载配置
vagrant status查看虚拟机状态
vagrant suspend暂停虚拟机
vagrant resume恢复虚拟机
vagrant package将当前 VirtualBox 虚拟机打包成 box

打包前清理虚拟机中的账号凭据、私钥和业务数据,避免一并分发出去。

最后修改:2018 年 02 月 26 日
如果觉得我的文章对你有用,请随意赞赏