Vagrant 简介和基础使用

标题 2019-06-28

Vagrant 实际上一套虚拟机管理工具,基于 Ruby 开发,底层支持 VirtualBox、VMware 甚至 AWS、Docker 等作为虚拟化系统。我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,“代码在我机子上运行没有问题”这种说法将成为历史。

Vagrant 本身并没有能力创建虚拟机,它是调用一些虚拟化工具来创建,如 VirtualBox, VMWare,甚至 AWS。

box

  1. 可被Vagrant直接使用的虚拟机镜像文件
  2. 基于不同虚拟化技术打包的box是不一样的

    Vagrant 简介和基础使用

  3. http://www.vagrantbox.es

安装

vagrant 支持在线安装,但是鉴于 GFW 的原因,国内用户使用的时候最好先在 http://www.vagrantbox.es 下载好要使用的 box在本地安装

# vagrant box 放在 ~/precise64.box

$ mkdir vagrant && cd vagrant
$ vagrant box add base ~/precise64.box
$ vagrant init (boxname)

basebox的名称,可以是任意的字符串,base 是默认名称,主要用来标识一下你添加的 box,后面的命令都是基于这个标识来操作的。

配置

$ vim Vagrnatfile

网络模式

  • 端口映射

    config.vm.network “forwarded_port", guest: 80, host: 8080
    guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口
  • __私有网络__(等效于设置virtualbox使用host-only模式网络适配器),自己自由的访问虚拟机,但是别人不需要访问虚拟机

    config.vm.network “private_network", ip: "192.168.33.10"
    192.168.33.10 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可
  • __公有网络__(等效于设置virtualbox使用bridged模式网络适配器),如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP

    config.vm.network “public_network"

目录映射

将本地的目录映射到虚拟机的对应目录,可以同时映射多个目录

config.vm.synced_folder "/Users/wangkun/www", "/vagrant_data"

前边的参数是本地目录,后边是映射目录

系统会自动映射宿主机当前目录到虚拟机根目录的 /vagrant

在该虚拟机上进行rm -rf操作的时候请谨慎一些,因为在虚拟机中最少也会挂载/vagrant目录,该目录是与你主机的项目共享的,删除的话会将项目删除掉。

启动脚本(非必须)

如果有需要在启动时运行一些脚本,可以编辑脚本,类似如下(摘自 Vagrant Document):

#!/usr/bin/env bash
$ apt-get update
$ apt-get install -y apache2
$ rm -rf /var/www
$ ln -fs /vagrant /var/www

保存在和Vagrantfile相同目录,文件名自取(如 boot.sh),然后在Vagrantfile中添加:

config.vm.provision :shell, :path => "boot.sh"

其他设置

设定VM的名称和内存大小等等

config.vm.provider "virtualbox" do |vb|
  vb.customize ["modifyvm", :id,
                "--name", "dev",
                "--cpus", "1",
                "--memory", "512"]
end

这行设置的意思是调用VBoxManagemodifyvm的命令,设置VM的名称为devcpu为1个核心,内存为512MB。你可以类似的通过定制其它VM属性来定制你自己的VM

启动并使用

$ vagrant up
$ vagrant ssh

os xlinux 下可以直接使用这个命令登录,windows下需要第三方软件支持,win10正式版PowerShell也将支持 SSH

常用命令

# 启动虚拟机
$ vagrant up

# 关闭虚拟机——对应就是关机
$ vagrant halt 

# 重新加载配置文件并启动,不会执行启动脚本
$ vagrant reload

# 重新加载配置文件并启动,强制执行启动脚本
$ vagrant reload --provision

# 暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用
$ vagrant suspend

# 恢复虚拟机 —— 与前面的暂停相对应
$ vagrant resume

# 删除虚拟机,删除后在当前虚拟机所做进行的除 Vagrantfile 中的配置都不会保留
$ vagrant destroy

# 可以看到虚拟机的状态,这个状态是被缓存起来的,可能不一定准确
$ vagrant global-status

# 刷新状态
$ vagrant global-status --prune

# 显示box列表
$ vagrant box list

打包

$ vagrant package --output NAME --vagrantfile FILE

可选参数:

--output NAME : (可选)设置通过 NAME 来指定输出的文件名

--vagrantfile FILE:(可选)可以将 Vagrantfile 直接封进 box 中

注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:

sudo rm -f /etc/udev/rule.d/70-persistent-net.rules

制作完成之后直接将box文件拿到其他计算机上配置即可使用。

多个VM的配置和启动

Vagrant支持在一个Vagrantfile中配置多个VM

单个 Vagrantfile

  • 各个VM的配置和启动都相对独立,如vagrant ssh时可不指定VM名。
  • Vagrantfile也不至于常常要改

多个 Vagrantfile

  • 一个Vagrantfile收录了整个大环境中所有VM的基本配置,一眼就知道环境里共有哪些VM,也不需要切换目录来检查各VM的状态,跟不会搞混了目录“丢掉”哪个倒霉的VM
  • 更多地使用Chef/Puppet来配置各VM,比如把VMip配置从Vagrantfile后推到puppet进行,保持Vagrantfile的简洁。目的是在对本地环境的VM配置,甚至生产环境的节点配置上,保持较高的一致性,有利于统一部署方式。

注意事项

  1. Vagrant启动报错的时候尝试用VirtualBox启动,可能会直接弹出VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED)这个错误,这是因为没有开启宿主机的虚拟化,重启宿主机进入bios,开启virtualiation选项即可
  2. HTTP服务器静态资源缓存问题,这个我没遇到

    //nginx
     sendfile off;
    
     //apache
     EnableSendfile off
  3. Vagrant 默认启动超时时间是300S,如果启动超时可以配置

    config.vm.boot_timeout = 1000

Vagrant 和 Docker 的区别

Vagrant

  • Vagrant 用来构建并运行基于 lxc(内核虚拟化技术) 的虚拟 Linux 容器
  • 易于配置、可量产、并且可移植的工作环境,并且由一个统一的工作流程进行控制
  • 在硬件级别分配资源,支持部署 Linux,Unix,Windows
  • 启动较 Docker 稍慢一些
  • 有点笨重,但是仍然比完整的虚拟机来得好,其他有点:同时支持和一些配置工具(如 Puppet,Chef)集成

Docker

  • Docker 基于 Linux 虚拟机的虚拟环境(Virtual Environment)工具。
  • 在软件级别分配资源,支持部署 Linux,Unix,Windows
  • 启动只需几秒钟,所创建的虚拟机的隔离级别和安全性:部分
  • 轻量级,其他有点:快速,易于学习
  • Vagrant 现在也具有一个 Docker 提供商,因此您可以用 Vagrant 来管理 Docker 的构建和部署

作者怎么说?

相关推荐