环境准备:安装 VirtualBox、Vagrant,搭建本地虚拟机环境

说实话,很多初学者一上来就想着怎么把代码部署到云服务器上,结果折腾半天连本地环境都没跑通。我见过太多人在这上面栽跟头了——本地能跑,上云就崩;或者反过来,云上配好了,本地又跑不起来。

所以这一章,咱们先把地基打牢。用 VirtualBox 和 Vagrant 搭一套本地虚拟机环境。你想想看,有了这套环境,你在本地就能模拟出一台远程服务器,随便折腾,搞坏了删掉重来,也就几分钟的事。

为什么选 VirtualBox + Vagrant?

市面上虚拟机工具不少,VMware、Hyper-V、Parallels 各有各的拥趸。但我个人习惯用 VirtualBox,原因很简单:免费、跨平台、社区活跃。你拿它做实验,完全不用担心授权问题。

至于 Vagrant,它本质上是个「虚拟机管家」。你写一个配置文件,它就能自动帮你下载镜像、配置网络、安装软件。我在项目中遇到过好几次这样的场景:团队新成员入职,光配开发环境就要花半天。后来我们用 Vagrant,一句 vagrant up,十分钟环境就齐活了。

核心思路:VirtualBox 负责跑虚拟机,Vagrant 负责自动化管理。两者配合,你就能像写代码一样管理你的虚拟机环境。

第一步:安装 VirtualBox

去官网下载对应你操作系统的版本就行。Windows、macOS、Linux 都支持。安装过程没什么特别的,一路下一步就好。

嗯,这里要注意一点:如果你用的是 Windows,安装完后最好检查一下 BIOS 里是否开启了虚拟化技术(VT-x/AMD-V)。没开的话,虚拟机跑起来会慢得让你怀疑人生。

小技巧:安装路径不要带中文和空格。我之前有个同事,装在了「Program Files (x86)」下面,结果 Vagrant 死活认不到 VirtualBox 的路径,折腾了半小时才发现是空格惹的祸。

第二步:安装 Vagrant

同样去官网下载安装包。Vagrant 的安装更简单,装完打开终端(CMD 或 PowerShell),输入 vagrant --version,能看到版本号就说明成了。

# 验证 Vagrant 是否安装成功
vagrant --version
# 输出示例:Vagrant 2.3.4

装完之后,我建议你顺手装一个插件:vagrant-vbguest。这个插件能自动更新 VirtualBox 的增强功能,省得你每次升级 VirtualBox 后还要手动去虚拟机里装一遍。

# 安装 vbguest 插件
vagrant plugin install vagrant-vbguest

第三步:初始化第一个虚拟机

现在我们来创建第一个虚拟机。找个空目录,打开终端,执行:

# 创建一个工作目录
mkdir my-first-vm
cd my-first-vm

# 初始化一个 Ubuntu 20.04 的虚拟机
vagrant init ubuntu/focal64

# 启动虚拟机
vagrant up

第一次执行 vagrant up 会下载镜像文件(box),大概几百兆,取决于你的网速。下载完成后,VirtualBox 里就会多出一台虚拟机。

启动成功后,你可以用 vagrant ssh 直接连进去,就像连一台远程服务器一样。

# 通过 SSH 登录虚拟机
vagrant ssh

# 进去之后,你就在一台 Ubuntu 服务器里了
# 试试看:
uname -a
# 输出:Linux ubuntu-focal 5.4.0-26-generic ...

注意:如果你在 Windows 上遇到 SSH 连接失败的问题,多半是因为没有安装 OpenSSH 客户端。去「设置 → 应用 → 可选功能」里加一个就行。我曾经在这上面卡了半小时,后来发现 Windows 默认居然没装这玩意儿。

Vagrantfile 详解

刚才 vagrant init 生成了一个叫 Vagrantfile 的文件。这是 Vagrant 的核心配置文件,说白了就是虚拟机的「说明书」。

我们打开看看:

Vagrant.configure("2") do |config|
  # 指定使用的镜像
  config.vm.box = "ubuntu/focal64"

  # 配置网络:端口转发
  config.vm.network "forwarded_port", guest: 80, host: 8080

  # 配置内存和 CPU
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2
  end

  # 启动时自动执行的脚本
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx
  SHELL
end

我来解释一下这几项配置:

  • config.vm.box:指定虚拟机用的操作系统镜像。你可以换成 centos/7、debian/buster64 等等。
  • forwarded_port:端口转发。把虚拟机里的 80 端口映射到你本机的 8080 端口,这样你在浏览器里访问 localhost:8080 就能看到虚拟机里的 Nginx 页面了。
  • provider:给 VirtualBox 传参数。这里设置了 1GB 内存和 2 个 CPU 核心。如果你的电脑配置一般,可以调低一点。
  • provision:自动化脚本。虚拟机启动后会自动执行,帮你装好 Nginx。这就是 Vagrant 最强大的地方——环境配置全自动化。

我的习惯:我会把 Vagrantfile 和项目代码放在同一个 Git 仓库里。这样任何人 clone 下来,执行 vagrant up 就能获得一模一样的开发环境。再也不用写那该死的「环境搭建文档」了。

常用 Vagrant 命令速查

命令 作用 使用场景
vagrant up 启动虚拟机 第一次创建或关机后重新启动
vagrant ssh SSH 登录虚拟机 进入虚拟机执行命令
vagrant halt 关机 暂时不用,节省资源
vagrant destroy 销毁虚拟机 彻底删除,释放磁盘空间
vagrant reload 重启并重新加载配置 修改 Vagrantfile 后生效
vagrant status 查看虚拟机状态 确认虚拟机是否在运行

搭建本地开发环境的完整流程

光说不练假把式。我们走一遍完整的流程,从零开始搭一个 Web 开发环境。

  1. 创建项目目录:mkdir my-web-app && cd my-web-app
  2. 初始化 Vagrant:vagrant init ubuntu/focal64
  3. 编辑 Vagrantfile:按上面的示例配置端口转发、内存和自动化脚本
  4. 启动虚拟机:vagrant up
  5. 验证环境:浏览器访问 localhost:8080,看到 Nginx 欢迎页就对了
  6. 开始开发:用 vagrant ssh 进去,或者通过共享目录直接在宿主机编辑代码

说到共享目录,Vagrant 默认会把你的项目目录挂载到虚拟机里的 /vagrant 路径下。你在宿主机改代码,虚拟机里立刻就能看到。反过来也一样。这个机制非常方便,我平时开发都是在本机用 VS Code 写代码,在虚拟机里跑服务。

工作流总结:宿主机写代码 → 共享目录同步 → 虚拟机里运行和测试 → 一切正常再部署到云端。这套流程我用了好几年,几乎没出过环境不一致的问题。

本章知识体系

下面这张图帮你理清 VirtualBox 和 Vagrant 的关系,以及整个本地环境的搭建流程:

本地虚拟机环境搭建流程 宿主机 你的电脑(Win/Mac/Linux) VirtualBox 虚拟机管理程序 Vagrant 自动化配置工具 虚拟机(Ubuntu 20.04) Nginx / Node.js / MySQL 共享目录 /vagrant 核心工作流 1. 在宿主机上用 VS Code 编写代码 2. 代码通过共享目录自动同步到虚拟机 3. 在虚拟机里运行和测试服务 4. 测试通过后,将代码部署到云端服务器

避坑指南

最后分享几个我踩过的坑,你遇到了可以少走弯路:

  • 镜像下载慢:Vagrant 默认从 HashiCorp 的服务器下载 box,国内速度很慢。你可以用 vagrant box add 配合镜像源,或者先下载好 .box 文件再本地添加。
  • 端口冲突:如果你本机的 8080 端口已经被占用了(比如 Jenkins、Grafana 之类的),改一下 Vagrantfile 里的 host: 8080 换成别的端口就行。
  • 磁盘空间不足:VirtualBox 默认的动态分配磁盘会越来越大。我有一回跑了个数据库压测,虚拟机直接吃掉了 30GB。建议在 Vagrantfile 里限制一下磁盘大小。
  • 网络模式选错:默认的 NAT 模式够用。如果你需要让其他设备访问你的虚拟机,改成桥接模式(bridged)。

重要提醒:千万不要在生产环境的服务器上直接装 VirtualBox。虚拟机是给开发和测试用的,生产环境请用 Docker 或直接部署到云服务器。我曾经见过有人把 VirtualBox 装在生产服务器上跑测试,结果把线上服务搞挂了——那场面,啧,别提了。