用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是我们要配置的对象,它的作用域在doend之间。

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 软件可以看到一个虚拟机正在运行

image-20230131173721100

相关操作

操作 命令
连接虚拟机 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 这个软件才能实现。

这个工具有两种方法

  1. 在 VirualBox 官网下载后安装到 VirualBox 软件中。
  2. 通过这个插件安装。

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 同步之前需要满足一些条件。

  1. 宿主机和虚拟机必须安装了nfsd,即 NFS 服务器守护程序,MacOS 和 Linux 通常都有预装。

  2. 如果使用 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官网 查看

------------ END ------------
© 2021 - 2023 Hexo @ Think . 豫ICP备17046389号-5