用Vagrant配置开发环境
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
根据自己的操作系统去 官网 下载合适的版本。
下载并安装软件
$ brew install hashicorp/tap/hashicorp-vagrant
命令行键入vagrant --version
返回 vagrant 版本号说明下载成功。
安装虚拟机
选择你熟悉的虚拟机软件,这里我用的是 virtualbox 因为免费,直接到 官网 下载对应的版本安装即可
创建虚拟机
在合适的目录执行vagrant init
初始化
$ mkdir vagrant # 创建一个目录
$ cd vagrant
$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
其中 centos/7
是我们给 box(镜像)起的名字。这个命令在当前目录为我们生成一个 Vagrantfile
文件,我们先来看下这个文件,看似有很多内容,去掉注释只有这三行
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
end
第一行的"2"
表示配置的版本,config
是我们要配置的对象,它的作用域在do
和end
之间。
config.vm.box = "centos/7"
指定box
(也就是镜像)的名字。
启动虚拟机
可以直接执行vagrant up
启动;也可以手动下载 box,将 box 添加到 vagrant 再执行命令启动虚拟机。
直接启动
执行vagrant up
在本地找到centos/7'
镜像启动虚拟机,如果没有找到,会自动到 vagrant镜像仓库 找名为centos/7'
的 box 下载。
$ vagrant up --provider virtualbox
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'centos/7' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'centos/7'
default: URL: https://vagrantcloud.com/centos/7
==> default: Adding box 'centos/7' (v2004.01) for provider: virtualbox
default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/2004.01/providers/virtualbox.box
Download redirected to host: cloud.centos.org
Progress: 18% (Rate: 67340/s, Estimated time remaining: 1:49:55)
--provider virtualbox
指定虚拟机软件。在 Vagrant 中虚拟机软件被称为 provider 。这里指定 provider 为 VirtualBox ,会在仓库中寻找 VirtualBox 的 box
正在龟速下载中,下载的 box 在/Users/用户名/.vagrant.d
目录中,下载完成之后虚拟机就启动了。
先下载box 再启动
我们还可以先下载好镜像,在启动虚拟机。到 vagrant仓库 手动下载,下载之后执行 vagrant box add
命令添加 box
$ vagrant box add /Users/dong/Downloads/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box --name centos/7
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos/7' (v0) for provider:
box: Unpacking necessary files from: file:///Users/dong/Downloads/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
==> box: Successfully added box 'centos/7' (v0) for 'virtualbox'!
或者直接添加 box 的网络地址
$ vagrant box add https://vagrantcloud.com/centos/boxes/7/versions/2004.01/providers/v
irtualbox.box --name centos/7
命令后面跟着的是下载的 box 路径,并且通过 --name
为这个 box 指定一个名字,这个名字要跟Vagrantfile
文件中的 box 名字保持一致,尽量把名字取得简短一点,同时也要能标识出这个镜像的信息
vagrant box list
命令查询 box 列表
$ vagrant box list
centos/7 (virtualbox, 2004.01)
手动添加 box 之后执行vagrant up
启动虚拟机
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' version '2004.01' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: No guest additions were detected on the base box for this VM! Guest
default: additions are required for forwarded ports, shared folders, host only
default: networking, and more. If SSH fails on this machine, please install
default: the guest additions and repackage the box to continue.
default:
default: This is not an error message; everything may continue to work properly,
default: in which case you may ignore this message.
==> default: Rsyncing folder: /Users/dong/dev/vagrant/ => /vagrant
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
vagrant up
命令要在Vagrantfile
所在的文件夹中执行
虚拟机启动之后可以通过vagrant status
命令查看虚拟机的运行状态。
$ vagrant status
Current machine states:
default running (virtualbox)
default
- 虚拟机的名字running
- 虚拟机的运行状态
这个时候打开 VirtualBox 软件可以看到一个虚拟机正在运行

相关操作
操作 | 命令 |
---|---|
连接虚拟机 | vagrant ssh |
查看 ssh 配置 | vagrant ssh-config |
挂载 | vagrant suspend |
恢复(和挂载搭配) | vagrant resume |
关机 | vagrant halt |
重启 | vagrant reload |
删除虚拟机 | vagrant destroy <name> |
每条命令都有参数,想知道都有那些参数可加
--help
查询。如:vagrant ssh --help
网络设置
我在虚拟机中搭建一台 web 服务器,如果想在宿主机浏览器访问这台 web 服务器,或者同一局域网的手机或其他电脑也想访问这台 web 服务器,这就需要我们搭建一下虚拟机的网络。
vagrant 提供了三种网络模式:端口转发、私有网络、共有网络
端口转发
把虚机的某个端口,映射到宿主机的端口上。这样就能在宿主机上访问到虚拟机中的服务。
如虚拟机上搭建一台 web 服务器,将80端口映射到宿主机上的8080(或其他端口)。然后,您可以打开浏览器访问 localhost:8080 并浏览网站,同时所有实际网络数据都将转发给虚拟机。
在 Vagrantfile
中使用config.vm.network
自行配置。
Vagrant.configure("2") do |config|
...
config.vm.network "forwarded_port", guest: 80, host: 8080
# 可以追加其他端口
config.vm.network "forwarded_port", guest: 3306, host: 33060
end
guest
虚拟机端口host
宿主机端口
这种方法并不实用,当我们有很多虚拟机的时候,每台虚拟机都要配置端口,使用起来不方便。
私有网络
私有网络类似本地局域网,虚拟机相当于局域网中的一台主机,可以相互访问局域网中的其他设备。
DHCP
私有网络的最简单方法是允许通过DHCP分配IP
Vagrant.configure("2") do |config|
...
config.vm.network "private_network", type: "dhcp"
end
查看虚拟机 IP 可以通过 vagrant ssh
进入虚拟机,用适当的命令行工具查看 IP,例如 ip address
。
静态IP
dhcp
虽然方便,但不利于管理虚拟机。我们可以给虚拟机指定 IP 地址
Vagrant.configure("2") do |config|
...
config.vm.network "private_network", ip: "192.168.33.10"
end
警告!请勿与局域网中任何其他 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 配置文件。我们可以把默认的同步文件夹注释掉
Vagrant.configure("2") do |config|
config.vm.base_mac = "5254004d77d3"
# config.vm.synced_folder ".", "/vagrant", type: "rsync"
end
VirtualBox
当我们使用 VirtualBox 虚拟机时,Vagrant 将 VirtualBox 设置成默认同步方式。这种同步是双向的实时同步,解决了 rsync 单向同步的弊端。
在 Vagrantfile
中使用config.vm.syncedFolders
进行配置。
Vagrant.configure("2") do |config|
...
config.vm.synced_folder "src/", "/srv/website"
end
由于使用 VirtualBox 虚拟机,
type: "vboxfs"
可以不写
- 第一个参数指向宿主机的目录,如果是相对路径则相对于项目跟目录。
- 第二个参数是虚拟机的目录,必须是绝对路径,如果目录不存在, vagrant 会自动创建。
配置好后我们重启下虚拟机看看
$ vagrant reload
==> default: Attempting graceful shutdown of VM...
==> default: Checking if box 'centos/7' version '2004.01' is up to date...
...
==> default: Mounting shared folders...
default: /srv/website => /Users/dong/dev/vagrant/src
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:
mount -t vboxsf -o uid=1000,gid=1000,_netdev srv_website /srv/website
The error output from the command was:
mount: unknown filesystem type 'vboxsf'
我们看到当挂载共享目录/srv/website => /Users/dong/dev/vagrant/src
的时候出错了。这是因为 VirtualBox 同步需要下载 VirtualBox Guest Additions 这个软件才能实现。
这个工具有两种方法
- 在 VirualBox 官网下载后安装到 VirualBox 软件中。
- 通过这个插件安装。
Vagrant 有个插件会帮我们自动安装,首先运行命令安装插件
$ 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 )时不需要这样做。
Vagrant.configure("2") do |config|
...
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.synced_folder ".", "/vagrant", type: "nfs"
end
定义多台虚拟主机
我们可以用config.vm.define
定义一台主机
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.define "centos1"
# 还可以继续追加
config.vm.define "centos2"
config.vm.define "centos3"
config.vm.define "centos4"
config.vm.synced_folder "src/", "/srv/website", type: "rsync"
end
这样就定义了4台的虚拟机,它们的 box 为 centos/7 ,并给他们配置了同步目录。执行vagrant up
创建4台虚拟机。
定义不同 box 并且每台虚拟机可以配置自己的参数:
Vagrant.configure("2") do |config|
config.vm.define "centos-test" do |conf|
conf.vm.box = "centos/7"
conf.vm.hostname = "centostest"
end
config.vm.define "centos-dev" do |conf|
conf.vm.box = "centos/7"
conf.vm.hostname = "centosdev"
end
config.vm.define "ubuntu-test" do |conf|
conf.vm.box = "ubuntu/xenial64"
conf.vm.hostname = "ubuntu"
end
config.vm.synced_folder "src/", "/srv/website", type: "rsync"
end
上面的代码可以看到,我们用两个 box 定义了三台虚拟机。每个虚拟机都可以分别配置自己的参数,也可以用 config 统一配置。
启动机器
在多机器环境中, 执行vagrant up
命令将启动所有定义的机器。如果你不想启动哪台主机可以配置 Vagrantfile 文件。
...
config.vm.define "ubuntu-test", autostart: false do |conf|
...
给指定主机设置autostart: false
,这样在执行vagrant up
就不启动 ubuntu-test 这台主机了。你可以单独执行vagrant up ubuntu-test
启动它。
默认主机
可以指定一台主机。当未指定多机环境中的特定机器时,主机将成为默认机器。要指定默认机器,只需在定义它时将其标记为 primary。只能指定一台主机。
...
config.vm.define "centos-test", primary: true do |conf|
...
不如运行vagrant ssh
会自动默认的虚拟机centos-test
。如果要连接其他虚拟机需要加上虚拟机的名字如:vagrant ssh centos-dev
END
到这里作为开发环境已经够用了,想要了解更多配置可以到 vagrant官网 查看