Vagrant 统一开发环境配置
bash vagrant --version VBoxManage --version # 验证 VirtualBox
## 快速上手:启动第一个 Vagrant 环境
### 创建一个项目目录
```bash
mkdir my-vagrant-project
cd my-vagrant-project
初始化 Vagrantfile
使用官方的 Ubuntu 22.04 盒子(Box)初始化:
vagrant init ubuntu/jammy64
此时目录下会生成一份 Vagrantfile,它是整个环境的蓝图。
启动虚拟机
vagrant up
该命令会自动下载 Box(若本地没有)、创建并启动虚拟机。首次下载可能需要一些时间。
连接进入虚拟机
vagrant ssh
你现在已经处于一个 Ubuntu 22.04 的虚拟机终端中,可以自由执行命令。退出时使用 exit。
常用生命周期命令
| 命令 | 作用 |
|---|---|
vagrant up |
启动并 provisioning(根据需要) |
vagrant halt |
关闭虚拟机(优雅关机) |
vagrant suspend |
挂起,保存当前状态 |
vagrant resume |
从挂起状态恢复 |
vagrant reload |
重启虚拟机,重新加载配置 |
vagrant destroy |
删除虚拟机(释放所有资源) |
vagrant status |
查看虚拟机运行状态 |
vagrant global-status |
查看所有 Vagrant 环境的概览 |
理解与定制 Vagrantfile
Vagrantfile 使用 Ruby 语法编写,但即便不懂 Ruby 也能轻松配置。打开自动生成的 Vagrantfile,关键区域如下:
配置 Box
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64" # 使用的 Box 名称
config.vm.box_version = "20240101.0.0" # 可选,指定 Box 版本
end
网络配置
Vagrant 支持多种网络模式,最常用的两种:
- 端口转发(Forwarded Port)
将宿主机端口映射到虚拟机端口。
此后访问宿主机config.vm.network "forwarded_port", guest: 80, host: 8080http://localhost:8080即达虚拟机 80 端口。 - 私有网络(Private Network)
宿主机与虚拟机之间组成私有局域网,可为虚拟机分配固定 IP。
推荐使用 Host-Only 网络,便于团队使用固定 IP 通信。config.vm.network "private_network", ip: "192.168.56.10"
共享文件夹
默认已挂载项目目录(含 Vagrantfile)到虚拟机 /vagrant。可添加更多自定义同步目录:
config.vm.synced_folder "./data", "/home/vagrant/data"
./data是宿主机项目目录下的子目录,必须提前创建。/home/vagrant/data是虚拟机内的挂载点。- 实时同步意味着在宿主机编辑代码,虚拟机内即时可见。
提供者(Provider)配置
针对 VirtualBox 可微调内存、CPU、显示名称等:
config.vm.provider "virtualbox" do |vb|
vb.name = "my-project-vm"
vb.memory = "2048"
vb.cpus = 2
end
若使用其他 Provider(如 VMware),需要对应块。
自动配置(Provisioning)
Provisioning 用于在虚拟机启动时自动安装软件、执行脚本,确保环境就绪。常用 Shell 脚本方式:
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
systemctl enable apache2
SHELL
也可引用外部脚本:
config.vm.provision "shell", path: "bootstrap.sh"
首次执行 vagrant up 时自动运行,之后重启不会重复运行,除非使用 vagrant up --provision 或 vagrant provision。
多机环境搭建
Vagrant 天生支持在一个 Vagrantfile 中定义多台机器,轻松模拟负载均衡、数据库分离等架构。
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.define "web" do |web|
web.vm.hostname = "web-server"
web.vm.network "private_network", ip: "192.168.56.20"
web.vm.provider "virtualbox" do |vb|
vb.name = "web_vm"
vb.memory = "1024"
end
end
config.vm.define "db" do |db|
db.vm.hostname = "db-server"
db.vm.network "private_network", ip: "192.168.56.30"
db.vm.provider "virtualbox" do |vb|
vb.name = "db_vm"
vb.memory = "1536"
end
db.vm.provision "shell", inline: "apt-get install -y mysql-server"
end
end
通过 vagrant up web 或 vagrant up db 可单独启动指定机器,vagrant up 启动全部。
Box 的管理
Box 是预先打包好的操作系统镜像。常用操作:
- 搜索公开 Boxes:访问 Vagrant Cloud。
- 添加 Box 到本地:
vagrant box add centos/7 - 查看已安装的 Boxes:
vagrant box list - 更新 Box:
vagrant box update(需在项目目录执行)或vagrant box outdated - 删除 Box:
vagrant box remove ubuntu/jammy64
实战示例:打造 Node.js 开发环境
目标:创建一个 Ubuntu 22.04 虚拟机,安装 Node.js 18,共享项目目录,转发应用端口。
-
新建项目并初始化:
mkdir nodejs-project cd nodejs-project vagrant init ubuntu/jammy64 -
编辑
Vagrantfile,修改为:Vagrant.configure("2") do |config| config.vm.box = "ubuntu/jammy64" config.vm.network "forwarded_port", guest: 3000, host: 3000 config.vm.network "private_network", ip: "192.168.56.50" config.vm.synced_folder "./app", "/home/vagrant/app", create: true config.vm.provider "virtualbox" do |vb| vb.memory = "1024" vb.name = "nodejs-dev" end config.vm.provision "shell", inline: <<-SHELL curl -fsSL https://deb.nodesource.com/setup_18.x | bash - apt-get install -y nodejs npm install -g yarn SHELL end -
在项目目录创建
app子目录(待共享)。 -
执行
vagrant up,等待环境构建完毕。 -
vagrant ssh进入虚拟机,运行node -v应显示 Node 18。 -
在宿主机
./app中创建文件server.js,内容如下:const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello from Vagrant!\n'); }); server.listen(3000, '0.0.0.0'); -
在虚拟机内进入
/home/vagrant/app,执行node server.js。 -
宿主机浏览器访问
http://localhost:3000,应看到 “Hello from Vagrant!”。
至此,一个可复现的 Node.js 开发环境已搭建完成,所有团队成员只需一份 Vagrantfile 即可获得相同环境。
常见问题与技巧
端口冲突
若宿主机端口已被占用,修改 host: 端口号即可。使用 vagrant reload 使新配置生效。
虚拟机时间同步
默认 VirtualBox Guest Additions 会同步时间。若时间偏差大,可在 provision 中添加安装 Guest Additions 或使用 NTP。
加速 Box 下载
Box 体积较大,推荐使用镜像地址或提前下载 Box 文件后通过本地文件添加:
vagrant box add my-box ./local-box-file.box
版本控制
将 Vagrantfile 纳入 Git 管理,但忽略 .vagrant/ 目录(该目录存放虚拟机 ID 等本地状态)。在 .gitignore 中添加:
.vagrant/