Vagrant
Vagrant 是由 HashiCorp公司开发的构建在 虚拟化技术 之上的虚拟机运行环境管理工具。通过 Vagrant 可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。
关于 Vagrant
Vagrant 是什么
Vagrant 的运行,需要依赖某项具体的虚拟化技术。由于 VirtualBox 是一项开源的虚拟化软件,可以同时在 Windows、Linux、Macintosh、SSolaris 等操作系统上运行并支持众多对众多操作系统的虚拟化,因此,在 Vagrant 开发的初期,唯一支持的是 VirtualBox。随着虚拟化技术的快速发展,现在已经有了更多的虚拟化技术可供选择。VMware、HyperV、Docker等都已经可以通过 Vagrant 的管理而工作。Windows 的 HyperV 技术在部分 Windows 发行版本中的集成,使得 Vagrant 在「开盒即用」的特性方面前进了一大步。
因此,Vagrant 是 虚拟机管理工具,不是某项具体的虚拟化技术。对于各项虚拟化技术而言,Vagrant 提供了一套基于配置文件和命令行的管理工具。也正是因为如此,Vagrant 完成了对虚拟化技术在一定程度上的封装。这为将虚拟化技术引入到基于桌面运行环境的开发工作流中创造了便利条件。
为什么要使用 Vagrant
- 使用 Vagrant,可以尽可能避免「Work on my machine」错误,保证所有人的开发环境一致。
- Vagrant 脚本化配置文件,可以实现开发环境的快速建立。
- 使用统一的配置文件(
vagrantfile)实现对服务器的统一配置。 - 使用共享文件夹(
shared folder)实现代码编辑向服务器的快速提交 - 使用软件配置脚本(
Provisioning scripts)实现服务器上的运行环境的快速建立 - 拥有标准化的虚拟机分享网络,极大缓解了分享开发环境配置时的网络带宽压力
- 可以具备一个供安装维护测试使用的可抛弃的服务器端环境。
- 使用统一的配置文件(
macOS 配置 Vagrant 环境
如上所说,「Vagrant 是虚拟机管理工具,而不是某项具体的虚拟化技术」。既然是管理虚拟机,那么自然需要虚拟机程序和被虚拟的操作系统镜像(Image)。前者常用的选择有 VirtualBox 和 VMWare,后者则包括 Ubuntu、FreeBSD 等等。Vagrant 称前者为provider,称后者为box。
- 安装 VirtualBox
VirtualBox作为一项广泛使用的开源虚拟化软件,理所当然成为我们的首选。在 macOS 上安装 virtualbox 直接去其官网上下载安装即可,具体可以参考 这里
- 安装 Vagrant
|
|
- 添加镜像
|
|
ubuntu/trusty64是一个公开 Boxes,运行上面第一行命令后,Vagrant 会在工作目录下创建 Vagrantfile 配置文件。在线下载 Box 会比较慢,你可以先下载 Box 之后,再加载本地的 Box 进行初始化。
在这里可以下载到各种系统镜像。
- 生成虚拟机
|
|
可以看到,执行 vagrant init命令会生成一个 Vagrantfile文件
- 启动虚拟机
|
|
- SSH 登录
|
|
- 关机
Vagrantfile 定制
这里是一个典型的 Vagrantfile 示例:
|
|
Hostname
|
|
Port Mapping
对宿主机器上 8080 端口的访问请求 forward 到虚拟机的 80 端口的服务上:
|
|
Network
Vagrant 有两种方式来进行网络连接:
- host-only (主机模式)
- 这种模式下所有的虚拟系统是可以互相通信的,但虚拟系统和真实的网络是被隔离开的,虚拟机和宿主机是可以互相通信的,相当于两台机器通过双绞线互联。
- Bridge(桥接模式)
- 该模式下的 VM 就像是局域网中的一台独立的主机,可以和局域网中的任何一台机器通信,这种情况下需要手动给 VM 配 IP 地址,子网掩码等。
我们一般选择 host-only 模式,配置如下:
|
|
Shared Folder
|
|
Provider
|
|
Provision
Cloud provisioning is the allocation of a cloud provider’s resources and services to a customer.
Provision是云计算中常见的一个概念,指的是云计算提供商给客户分配资源和服务,Provisioner 也就是资源分配者,在 Vagrant 中可以使用 shell来进行资源分配过程,当然也提供了 docker、salt等其他方式。
Provisioners in Vagrant allow you to automatically install software, alter configurations, and more on the machine as part of the
vagrant upprocess.
下面是一个简单地例子,里面主要配置了一些常用软件。
|
|
问题索引
增加磁盘
为了让虚拟机能够加载新的磁盘,首先我们需要创建磁盘,使用 VBoxManage命令即可。
|
|
通过 VBoxManage命令把磁盘加载到虚拟机的命令如下:
|
|
针对这里的几个参数解释如下:
- myvm 是想要挂载磁盘的虚拟机名,可以通过
VBoxManage命令查看
|
|
storagectl指明Name of the storage controller,这部分信息可以通过下列命令看到
|
|
可以看到,这个虚拟机默认支持 IDE和SCSI两种存储控制器,当前使用SCSI存放了两个磁盘。
进入虚拟机,也可以看到
|
|
port指的是存储控制器使用的端口。device指的是The number of the port's device which is to be modifiedtype指的是Define the type of the drive to which the medium is being attachedmedium指定对应的磁盘文件
把上述命令对应到 Vagrantfile,代码如下:
|
|
{% note info %}
注意这里用的是 SCSI而不是IDE,主要是在使用IDE创建的时候,一直没有成功,显示 Timed out while waiting for the machine to boot.
另外,根据上述配置的时候,可能会出现 Could not find a controller named 'SCSI Controller'的问题,参考 GitHub 上的这个 issue,我们知道:
This is not a Vagrant isue.
The issue relies on Virtualbox use different Controller names between os.
In some OS can be
IDE Controllerbut in other is justIDE
1 2 3 4$ VBoxManage list vms "c7_host01_1481400784099_26895" {97bec202-de3a-4b06-b790-4aa742671dd0} $ VBoxManage showvminfo 97bec202-de3a-4b06-b790-4aa742671dd0 | grep 'Storage Controller Name' Storage Controller Name (0): IDE
{% endnote %}
To be added
这部分以后会动态更新。
Vagrant 命令备忘
|
|
VirtualBox 命令备忘
|
|
备注:使用 VBoxManage modifyvm 命令的前提是虚拟机已经处于关机状态;
参考资料
-
No backlinks found.