Vagrant 统一开发环境配置

FreeGuideOnline 最新 2026-07-08

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: 8080
    
    此后访问宿主机 http://localhost:8080 即达虚拟机 80 端口。
  • 私有网络(Private Network) 宿主机与虚拟机之间组成私有局域网,可为虚拟机分配固定 IP。
    config.vm.network "private_network", ip: "192.168.56.10"
    
    推荐使用 Host-Only 网络,便于团队使用固定 IP 通信。

共享文件夹

默认已挂载项目目录(含 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 --provisionvagrant 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 webvagrant up db 可单独启动指定机器,vagrant up 启动全部。

Box 的管理

Box 是预先打包好的操作系统镜像。常用操作:

  • 搜索公开 Boxes:访问 Vagrant Cloud
  • 添加 Box 到本地vagrant box add centos/7
  • 查看已安装的 Boxesvagrant box list
  • 更新 Boxvagrant box update(需在项目目录执行)或 vagrant box outdated
  • 删除 Boxvagrant box remove ubuntu/jammy64

实战示例:打造 Node.js 开发环境

目标:创建一个 Ubuntu 22.04 虚拟机,安装 Node.js 18,共享项目目录,转发应用端口。

  1. 新建项目并初始化:

    mkdir nodejs-project
    cd nodejs-project
    vagrant init ubuntu/jammy64
    
  2. 编辑 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
    
  3. 在项目目录创建 app 子目录(待共享)。

  4. 执行 vagrant up,等待环境构建完毕。

  5. vagrant ssh 进入虚拟机,运行 node -v 应显示 Node 18。

  6. 在宿主机 ./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');
    
  7. 在虚拟机内进入 /home/vagrant/app,执行 node server.js

  8. 宿主机浏览器访问 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/