Vagrant 是一个虚拟机管理工具,它可以快速搭建和部署开发环境,能让我们更加方便的使用虚拟机。
肯定有人会问,为什么不用 Docker ?Docker 优点自不必说,轻量、高效、占用资源少、部署方便,能快速部署一个运行环境。Docker 必须部署在 Linux 内核的系统上。如果在其他系统部署 ,Docker 会安装一个虚拟 Linux 环境。在开发中一般用 Windows 或 macOs ,不如直接使用虚拟机,我们可以在虚拟机里安装 Docker 。当然这不是绝对的,请各位大爷按自己的喜好来。
环境
宿主机:macOS Monterey 12.6.3
vagrant:Vagrant 2.3.4
虚拟机:VirtualBox 7.0.6
安装
需要先下载 vagrant 和虚拟机软件。
安装 vagrant
根据自己的操作系统去 官网 下载合适的版本。
下载并安装软件
1 | $ brew install hashicorp/tap/hashicorp-vagrant |
命令行键入vagrant --version
返回 vagrant 版本号说明下载成功。
安装虚拟机
选择你熟悉的虚拟机软件,这里我用的是 virtualbox 因为免费,直接到 官网 下载对应的版本安装即可
创建虚拟机
在合适的目录执行vagrant init
初始化
1 | $ mkdir vagrant # 创建一个目录 |
其中 centos/7
是我们给 box(镜像)起的名字。这个命令在当前目录为我们生成一个 Vagrantfile
文件,我们先来看下这个文件,看似有很多内容,去掉注释只有这三行
1 | Vagrant.configure("2") do |config| |
第一行的"2"
表示配置的版本,config
是我们要配置的对象,它的作用域在do
和end
之间。
config.vm.box = "centos/7"
指定box
(也就是镜像)的名字。
启动虚拟机
可以直接执行vagrant up
启动;也可以手动下载 box,将 box 添加到 vagrant 再执行命令启动虚拟机。
直接启动
执行vagrant up
在本地找到centos/7'
镜像启动虚拟机,如果没有找到,会自动到 vagrant镜像仓库 找名为centos/7'
的 box 下载。
1 | $ vagrant up --provider virtualbox |
--provider virtualbox
指定虚拟机软件。在 Vagrant 中虚拟机软件被称为 provider 。这里指定 provider 为 VirtualBox ,会在仓库中寻找 VirtualBox 的 box
正在龟速下载中,下载的 box 在/Users/用户名/.vagrant.d
目录中,下载完成之后虚拟机就启动了。
先下载box 再启动
我们还可以先下载好镜像,在启动虚拟机。到 vagrant仓库 手动下载,下载之后执行 vagrant box add
命令添加 box
1 | vagrant box add /Users/dong/Downloads/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box --name centos/7 |
或者直接添加 box 的网络地址
1 | vagrant box add https://vagrantcloud.com/centos/boxes/7/versions/2004.01/providers/v |
命令后面跟着的是下载的 box 路径,并且通过 --name
为这个 box 指定一个名字,这个名字要跟Vagrantfile
文件中的 box 名字保持一致,尽量把名字取得简短一点,同时也要能标识出这个镜像的信息
vagrant box list
命令查询 box 列表
1 | $ vagrant box list |
手动添加 box 之后执行vagrant up
启动虚拟机
1 | $ vagrant up |
vagrant up
命令要在Vagrantfile
所在的文件夹中执行
虚拟机启动之后可以通过vagrant status
命令查看虚拟机的运行状态。
1 | $ vagrant status |
default
- 虚拟机的名字running
- 虚拟机的运行状态
这个时候打开 VirtualBox 软件可以看到一个虚拟机正在运行

相关操作
操作 | 命令 |
---|---|
连接虚拟机 | vagrant ssh |
查看 ssh 配置 | vagrant ssh-config |
挂载 | vagrant suspend |
恢复(和挂载搭配) | vagrant resume |
关机 | vagrant halt |
重启 | vagrant reload |
删除虚拟机 | vagrant destroy <name> |
删除box | vagrant box remove <name> |
每条命令都有参数,想知道都有那些参数可加
--help
查询。如:vagrant ssh --help
网络设置
我在虚拟机中搭建一台 web 服务器,如果想在宿主机浏览器访问这台 web 服务器,或者同一局域网的手机或其他电脑也想访问这台 web 服务器,这就需要我们搭建一下虚拟机的网络。
vagrant 提供了三种网络模式:端口转发、私有网络、共有网络
端口转发
把虚机的某个端口,映射到宿主机的端口上。这样就能在宿主机上访问到虚拟机中的服务。
如虚拟机上搭建一台 web 服务器,将80端口映射到宿主机上的8080(或其他端口)。然后,您可以打开浏览器访问 localhost:8080 并浏览网站,同时所有实际网络数据都将转发给虚拟机。
在 Vagrantfile
中使用config.vm.network
自行配置。
1 | Vagrant.configure("2") do |config| |
guest
虚拟机端口host
宿主机端口
这种方法并不实用,当我们有很多虚拟机的时候,每台虚拟机都要配置端口,使用起来不方便。
私有网络
私有网络类似本地局域网,虚拟机相当于局域网中的一台主机,可以相互访问局域网中的其他设备。
DHCP
私有网络的最简单方法是允许通过DHCP分配IP
1 | Vagrant.configure("2") do |config| |
查看虚拟机 IP 可以通过 vagrant ssh
进入虚拟机,用适当的命令行工具查看 IP,例如 ip address
。
静态IP
dhcp
虽然方便,但不利于管理虚拟机。我们可以给虚拟机指定 IP 地址
1 | Vagrant.configure("2") do |config| |
**警告!**请勿与局域网中任何其他 IP 冲突。这可能会导致网络无法访问。
共有网络
共有网络对应的就是桥接网络。我们一般不会需要把虚机暴露到公共网络上,这样不安全。
同步文件夹
vagrant 能将宿主机的文件同步到虚拟机,从而方便我们的工作。vagrant 提供了 Rsync、VirtualBox、SMB、NFS这四种同步方式
Rsync
vagrant 默认将项目目录(也就是Vagrantfile
文件所在的目录)共享到虚拟机的/vagrant
目录,同步方式是rsync
。
Rsync 同步是单向同步且一次性的,意思是只能宿主机的文件同步到虚拟机,反之不行。而且必须重启过虚拟机之后才能看到同步文件,也就是说修改一次文件,就要重启一次虚拟机,才能看到更改的内容。显然 rsync 同步方式不是我们想要的。
它定义在 /Users/dong/.vagrant.d/boxes/centos-VAGRANTSLASH-7/2004.01/virtualbox/Vagrantfile
文件中,这是对 box 的基础配置,每个 box 都有自己的 Vagrantfile 配置文件。我们可以把默认的同步文件夹注释掉
1 | Vagrant.configure("2") do |config| |
VirtualBox
当我们使用 VirtualBox 虚拟机时,Vagrant 将 VirtualBox 设置成默认同步方式。这种同步是双向的实时同步,解决了 rsync 单向同步的弊端。
在 Vagrantfile
中使用config.vm.syncedFolders
进行配置。
1 | Vagrant.configure("2") do |config| |
由于使用 VirtualBox 虚拟机,
type: "vboxfs"
可以不写
- 第一个参数指向宿主机的目录,如果是相对路径则相对于项目跟目录。
- 第二个参数是虚拟机的目录,必须是绝对路径,如果目录不存在, vagrant 会自动创建。
配置好后我们重启下虚拟机看看
1 | vagrant reload |
我们看到当挂载共享目录/srv/website => /Users/dong/dev/vagrant/src
的时候出错了。这是因为 VirtualBox 同步需要下载 VirtualBox Guest Additions 这个软件才能实现。
这个工具有两种方法
- 在 VirualBox 官网下载后安装到 VirualBox 软件中。
- 通过这个插件安装。
Vagrant 有个插件会帮我们自动安装,首先运行命令安装插件
1 | $ vagrant plugin vagrant-vbguest |
vagrant plugin
是安装插件的命令,后面跟插件的名字可以执行
vagrant plugin list
查看插件列表
安装好插件后,执行vagrant up
时,如果虚拟机中没有安装 VirtualBox Guest Additions 或者版本低,插件会自动更新虚拟机里的 VirtualBox Guest Additions 。
NFS
在某些情况下,默认同步方式(如 VirtualBox 同步)具有很高的性能损失。如果你发现同步文件夹的性能不尽如人意,则可以使用NFS提供解决方案。
NFS 同步在 Windows主机上不起作用。Vagrant 将忽略 Windows上的 NFS 同步请求。
先决条件
在使用 NFS 同步之前需要满足一些条件。
宿主机和虚拟机必须安装了nfsd,即 NFS 服务器守护程序,MacOS 和 Linux 通常都有预装。
如果使用 VirturalBox 虚拟机,必须把网络设置成私有网络。这是 VirturalBox 的限制,使用其他虚拟机(如 VMware )时不需要这样做。
1 | Vagrant.configure("2") do |config| |
定义多台虚拟主机
我们可以用config.vm.define
定义一台主机
1 | Vagrant.configure("2") do |config| |
这样就定义了4台的虚拟机,它们的 box 为 centos/7 ,并给他们配置了同步目录。执行vagrant up
创建4台虚拟机。
定义不同 box 并且每台虚拟机可以配置自己的参数:
1 | Vagrant.configure("2") do |config| |
上面的代码可以看到,我们用两个 box 定义了三台虚拟机。每个虚拟机都可以分别配置自己的参数,也可以用 config 统一配置。
启动机器
在多机器环境中, 执行vagrant up
命令将启动所有定义的机器。如果你不想启动哪台主机可以配置 Vagrantfile 文件。
1 | ... |
给指定主机设置autostart: false
,这样在执行vagrant up
就不启动 ubuntu-test 这台主机了。你可以单独执行vagrant up ubuntu-test
启动它。
默认主机
可以指定一台主机。当未指定多机环境中的特定机器时,主机将成为默认机器。要指定默认机器,只需在定义它时将其标记为 primary。只能指定一台主机。
1 | ... |
不如运行vagrant ssh
会自动默认的虚拟机centos-test
。如果要连接其他虚拟机需要加上虚拟机的名字如:vagrant ssh centos-dev
END
到这里作为开发环境已经够用了,想要了解更多配置可以到 vagrant官网 查看