地址置顶:
https://www.vagrantup.com/intro/getting-started
更新:(3.0_20190717 )
索引
官网总体上比较简单,主要是:
1、简单文档:https://www.vagrantup.com/
2、指引文档:https://www.vagrantup.com/intro/getting-started/index.html
3、详细文档:https://www.vagrantup.com/docs
快速介绍
Vagrant是一个以相同工作流 构建和管理虚拟机环境 的工具
好处主要是可以通过vagrant 统一管理多个机子的环境(不管是统一操作还是统一环境)
可以用作团队内环境的复用、快速的新建、以及备用。
当然人们可以自己根据各个虚拟机编写脚本,但是 Vagrant集成在内部
并且提供了多种方式(共享文件夹 ,provisioner)和快捷处理(ssh.http).
在兼容上也更加省心(基于各种虚拟软件,如VirtualBox、VMware),它让用户忽略了底层的CLI。
竞品比较
Vagrant不是独有的用来管理虚拟机和开发环境的工具
- Docker
Vagrant专注于,跨操作系统,提供统一的开发环境工作流,
Docker是容器管理工具,能够让容器在containerization的系统上运行一致(macOS,Linux,Windows都可以实现containerization,BSD等不行),
对于微服务,显然Docker更好,当然Vagrant使用Docker作为Provider也能实现.
很多时候纯Docker的工作流也会比Vagrant统一化的更适合.
vagrant和docker的比较一直不明白,留待使用后再说。
感觉前者是跨平台为主,后者是快速部署为主
只是后者也在主流系统上有了兼容,所以能在某种程度上实现跨平台
而前者启动之后,也能支持后者的部署
- Terraform
都是HashiCorp的项目,Terraform是一个构建基础架构的工具,他们会有重叠,比如都可以配置虚拟机的生命周期。
但是V目的在于开发环境可用性,而T在于span multiple cloud provider的基础架构–主要为了管理远程资源
(既然不是类似的东西,比啥比。。。感觉是自家广告)
安装
安装自带配置环境变量,安装好了使用vagrant命令即可
https://www.vagrantup.com/docs/installation/
1.0兼容略过。
不建议用系统的包管理工具,经常过时。
启动虚拟机时,如果hypervisor正在被使用,windows应该会蓝屏。文末给出了不同系统环境的确认方法。
操作和概念:
首先我们想要启动vagrant 虚拟机,而虚拟机的启动建立在一个配置文件之上,这个配置文件是VagrantFile:
- 一个Vagrant项目 对应一个VagrantFile,可配置项包括:根目录、机器、资源相关的配置
- Vagrant项目,按我目前的理解,就是启动过虚拟机后,当前目录包含的东西。
有了配置文件,就可以启动了。
系统会将VagrantFile 所在的目录和虚拟机的
/vagrant
共享,慎用rm -rf
刚进入主机时,是处在/home/vagrant目录,不要搞混了
根据VagrantFile 的配置 是从头开始初始化虚拟机,可能耗费的时间很长。
还有一种保存虚拟机状态的方式,即Box(需要先通过命令添加,同时在Vagrant 中指定):
- 一个Vagrant实例,可以被制作成一个box,或者从一个box生成。可以理解成基础镜像
box自然是可以分享的
boxs search official: https://app.vagrantup.com/boxes/search
boxs search community: http://www.vagrantbox.es/
而上述两种仅仅是静态的启动虚拟机,相应的还可以动态的添加一些额外的准备,
即Provision(通过在VagrantFile中配置 bootstrap.sh
文件):
如果bootstrap.sh比较复杂,显然更好的方式是把所有安装好之后,打包一个Vagrant Box
- 实例启动后,需要一系列的自动化准备,这个过程叫做Provision。
provision tools包括: shell scripts, chef, puppet…
- 教程中虚拟机基于Virtual Box… 而有时候需要别的虚拟机支持,就可以设置对应的Provider.
支持provision的provider有: VirtualBox, VMware, AWS
启动流程
有了一个整体的理解,我们再回过头来细说vagrant 解读 VagrantFile的过程。
VagrantFile会在多处出现,
首先会被打包进 box中
然后是vagrant的默认home目录(一般是~/.vagrant.d)
再者就是项目启动目录
。。。(待续)
命令
vagrant --help
遇到的问题
Q:
vagrant 创建虚拟机的时候。如果直接用命令行在官方地址下载,基本卡死,最好先下载box到本地。
A:
方法:可以在命令行输出中看到下载地址,然后把地址放到chorme中,可以在下载信息中看到另一个实际地址,两个的速度也都很慢(后来不知怎么,匿名模式下重下突然快了)。
或者清华源:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/
Q:
提示版本不一致:
The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.40
default: VirtualBox Version: 5.2
A:
手动更新版本或者安装插件vagrant plugin install vagrant-vbguest
示例
VagrantFile
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.box_version = "1.1.0"
config.vm.box_url = "https://vagrantcloud.com/hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh" #相对路径
config.vm.network :forwarded_port, guest: 80, host: 4567
end
bootstrap.sh
在这个bootstrap.sh脚本中,安装好 Apache之后, /var/www/文件夹指向的是启动的目录。
apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
特别的地方
可以直接通过命令将本地部署的服务分享给其他人访问,并且是热更新的。
但是实际使用也不是那么方便,通过第三方的ngrok 实现(即需要先下载),再安装一个插件来屏蔽第三方的使用。
比如vagrant share 并没有生成地址,反而是直接用了ngrok 的命令