开发过程中,本地运行正常,到了测试环境却出了问题,有时就是环境配置不一致造成的。在本地虚拟机中搭建一套接近线上配置的环境,能减少这类问题。
不过,让团队里每个人都手动安装系统、配置软件,还是挺费事的。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=virtualboxvagrant 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
endVagrant.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 |
打包前清理虚拟机中的账号凭据、私钥和业务数据,避免一并分发出去。