Vagrant 简介
Vagrant 是为了方便的实现虚拟化环境而设计的,使用 Ruby 开发,基于 VirtualBox 等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用 Vagrant 可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,这样我们平时还可以在开发机模拟分布式系统。
VirtualBox 简介
VirtualBox – Oracle 公司的虚拟机软件, 能运行在当前大部分流行的系统上。
安装
下载安装 VirtualBox :https://www.virtualbox.org/
下载安装 Vagrant :http://www.vagrantup.com/
在线查找需要的box,这里下载CentOS/7
https://app.vagrantup.com/boxes/search
拼下载 URL:
'https://app.vagrantup.com/centos/boxes/7/versions/1812.01' + '/providers/' + '供应商名字/' + '.box'
公式:下载链接 = 产品版本链接 + 供应商英文意思 + 要下载的供应商名称(如virtualbox)+’.box’
如上选择的是版本是 v1812.01 ,生成的下载链接为 :
https://app.vagrantup.com/centos/boxes/7/versions/1812.01/providers/virtualbox.box
下载时最好都下载最新版本,确保版本要兼容。
安装顺序:先安装 VirtualBox,后安装 Vagrant。都是默认安装即可,也可以选择安装路径。浏览器下载太慢,可以复制下载地址到迅雷下载。
第一步,新建目录
比如在 D 盘新建目录
mkdir -p vagrant/centos01
cd vagrant/centos01
第二步,添加box
在 D:/vagrant/centos01 目录下执行添加 box 命令。如果添加的镜像在本地不存在,就会转为自动下载,下载源是外网,会非常慢,所以前面我们都先自己下载好镜像在添加。这里镜像放在 E:/BaiduYunDownload 目录下
vagrant box add centos-7.0 E:/BaiduYunDownload/centos-7.0-x86_64.box
centos-7.0 为 box 指定名称,使用 base 时,之后可以直接使用 vagrant init 进行初始化,如果自行指定名称,则初始化的时候需要指定 box 的名称。
执行添加命令之后可以以下命令查看添加的box
vagrant box list
第三步,初始化配置文件
设置好 box 之后,在当前工作目录运行初始化生成配置文件 Vagrantfile,需要指定 box 名字,否则配置文件生成默认的配置box,config.vm.box = “base”,也可以自己修改
vagrant init centos-7.0
遇到问题:
The user that is running Vagrant doesn’t have the proper permissions
to write a Vagrantfile to the specified location. Please ensure that
you call vagrant init
in a location where the proper permissions
are in place to create a Vagrantfile.
解决方法:
这是权限不足,用管理员运行cmd在执行 vagrant init [box-name] 即可
第四步,启动box
vagrant up
遇到问题:
Stderr: VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
由于启用了Hyper-V
解决方法:
在控制中心 -》应用 -》程序和功能 -》开启关闭windows程序中,将Hyper-V关闭,重启电脑。
第五步,登录虚拟机
vagrant ssh
第六步,配置共享文件夹
默认是将 vagrant 配置文件所在目录挂载到虚拟机 /vagrant 目录下
修改成其他目录,首先要在虚拟机创建好映射的目录
[vagrant@10 /]$ sudo mkdir /code
配置 Vagrantfile,第一个参数是本机的目录,第二个参数是虚拟机挂载的目录
config.vm.synced_folder "D:/WWW", "/code"
保存好配置之后需要执行命令配置才生效
vagrant reload
$ vagrant ssh
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@10 ~]$ ll
insgesamt 24
-rwxr-xr-x 1 vagrant vagrant 450 16. Jul 2015 base.sh
-rwxr-xr-x 1 vagrant vagrant 118 16. Jul 2015 cleanup.sh
-rwxr-xr-x 1 vagrant vagrant 360 16. Jul 2015 puppet.sh
-rwxr-xr-x 1 vagrant vagrant 674 16. Jul 2015 vagrant.sh
-rwxr-xr-x 1 vagrant vagrant 260 16. Jul 2015 virtualbox.sh
-rwxr-xr-x 1 vagrant vagrant 105 16. Jul 2015 zerodisk.sh
至此虚拟机 CentOS 就搭配好了
配置文件 Vagrantfile
指定 box
Vagrant.configure("2") do |config|
config.vm.box = "centos-7.0" #指定box名字
这两行就是我们在 vagrant init 中后面所指定的参数。由此可以看出,vagrant init 只是帮我们生成了配置文件而已,换句话说,如果我们写好了Vagrantfile,就不需要 vagrant init,只需将准备好的配置文件放入到所需目录中,然后直接执行 vagrant up 即可。
网络配置
Vagrant有两种方式来进行网络连接,一种是host-only(主机模式),意思是主机和虚拟机之间的网络互访,而不是虚拟机访问internet的技术,也就是只有你一個人自High,其他人访问不到你的虚拟机。另一种是Bridge(桥接模式),该模式下的VM就像是局域网中的一*立的主机,也就是说需要VM到你的路由器要IP,这样的话局域网里面其他机器就可以访问它了,一般我们设置虚拟机都是自high为主,所以我们的设置一般如下:
config.vm.network :private_network, ip: "11.11.11.11" #设置ip
这里我们虚拟机设置为host-only,并且指定了一个IP,IP的话建议最好不要用192.168…这个网段,因为很有可能和你局域网里面的其它机器IP冲突,所以最好使用类似11.11…这样的IP地址。
使用host-only模式时可能报错:
Stderr: 0%…
Progress state: E_INVALIDARG
VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Assertion failed: [!aInterfaceName.isEmpty()] at ‘F:\tinderbox\win-6.0\src\VBox\Main\src-server\HostNetworkInterfaceImpl.cpp’ (76) in long __cdecl HostNetworkInterface::init(class com::Bstr,class com::Bstr,class com::Guid,enum __MIDL___MIDL_itf_VirtualBox_0000_0000_0044).
VBoxManage.exe: error: Please contact the product vendor!
解决方法:
-
在virtualbox 管理 - > 全局设定 -> 网络 - > tab 仅主机网络 - > 添加
正常情况下是可以添加成功的,但是有可能报
Could not find Host Interface Networking driver!Please reinstall(找不到主机接口网络驱动程序!请重新安装) -
如果第一步报错,这是因为之前卸载虚拟网卡的时候把驱动也给删除了。
可以在安装virtualbox目录…/Oracle VM VirtualBox中的 drivers\ network\ netadp6目录下有三个文件
VBoxNetAdp6.cat
VBoxNetAdp6.inf
VBoxNetAdp6.sys
这就是virtualbox虚拟网卡的驱动,右击VBoxNetAdp6.inf,右键点安装即可。
然后再做第二步。应该可以完成了。
端口转发
config.vm.network :forwarded_port, guest: 80, host: 8080 #设置端口
这一行的意思是把对host机器上8080端口的访问请求forward到虚拟机的80端口的服务上,例如你在你的虚拟机上使用nginx跑了一个Go应用,那么你在host机器上的浏览器中打开http://localhost:8080时,Vagrant就会把这个请求转发到VM里面跑在80端口的nginx服务上,因此我们可以通过这个设置来帮助我们去设定host和VM之间,或是VM和VM之间的信息交互。
hostname 配置
config.vm.hostname = "go-app" #主机名
设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的,例如Puppet或是Chef,都是通过hostname來做识别的,既然设置那么简单,所以我们就別偷懒,设置一个。
相关命令
vagrant box 基本命令
- 列出本地环境中所有的box
vagrant box list
- 添加box到本地vagrant环境,自动生成vagrantfile
vagrant box add box-name (box-url)
- 更新本地环境中指定的box
vagrant box update box-name
- 删除本地环境中指定的box
vagrant box remove box-name
- 重新打包本地环境中指定的box
vagrant box repackage box-name
vagrant 基本命令
- 在空文件夹初始化虚拟机
vagrant init box-name
- 在初始化完的文件夹内启动虚拟机,没有密码
vagrant up
- ssh登录启动的虚拟机,没有密码
vagrant ssh
- 挂起启动的虚拟机
vagrant suspend
- 重启虚拟机,会加载vagrantfile文件,修改配置文件要执行
vagrant reload
- 关闭虚拟机
vagrant halt
- 查找虚拟机的运行状态
vagrant status
- 销毁当前虚拟机
vagrant destroy
参考:
https://www.cnblogs.com/wangkongming/p/4301021.html
https://www.cnblogs.com/hafiz/p/9175484.html