Vagrant

本文介绍了Vagrant这一工具,用于构建和管理虚拟机环境,强调其在统一开发环境和团队协作中的作用。对比Docker和Terraform,阐述各自的适用场景。文章详细解释了Vagrant的安装、配置和使用流程,包括VagrantFile、Box和Provision的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址置顶:
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 的命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值