环境准备:安装 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 开发环境。
- 创建项目目录:
mkdir my-web-app && cd my-web-app - 初始化 Vagrant:
vagrant init ubuntu/focal64 - 编辑 Vagrantfile:按上面的示例配置端口转发、内存和自动化脚本
- 启动虚拟机:
vagrant up - 验证环境:浏览器访问
localhost:8080,看到 Nginx 欢迎页就对了 - 开始开发:用
vagrant ssh进去,或者通过共享目录直接在宿主机编辑代码
说到共享目录,Vagrant 默认会把你的项目目录挂载到虚拟机里的 /vagrant 路径下。你在宿主机改代码,虚拟机里立刻就能看到。反过来也一样。这个机制非常方便,我平时开发都是在本机用 VS Code 写代码,在虚拟机里跑服务。
工作流总结:宿主机写代码 → 共享目录同步 → 虚拟机里运行和测试 → 一切正常再部署到云端。这套流程我用了好几年,几乎没出过环境不一致的问题。
本章知识体系
下面这张图帮你理清 VirtualBox 和 Vagrant 的关系,以及整个本地环境的搭建流程:
避坑指南
最后分享几个我踩过的坑,你遇到了可以少走弯路:
- 镜像下载慢:Vagrant 默认从 HashiCorp 的服务器下载 box,国内速度很慢。你可以用
vagrant box add配合镜像源,或者先下载好 .box 文件再本地添加。 - 端口冲突:如果你本机的 8080 端口已经被占用了(比如 Jenkins、Grafana 之类的),改一下 Vagrantfile 里的
host: 8080换成别的端口就行。 - 磁盘空间不足:VirtualBox 默认的动态分配磁盘会越来越大。我有一回跑了个数据库压测,虚拟机直接吃掉了 30GB。建议在 Vagrantfile 里限制一下磁盘大小。
- 网络模式选错:默认的 NAT 模式够用。如果你需要让其他设备访问你的虚拟机,改成桥接模式(bridged)。
重要提醒:千万不要在生产环境的服务器上直接装 VirtualBox。虚拟机是给开发和测试用的,生产环境请用 Docker 或直接部署到云服务器。我曾经见过有人把 VirtualBox 装在生产服务器上跑测试,结果把线上服务搞挂了——那场面,啧,别提了。