一、介绍

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef 创建自动化虚拟环境。同时,Vagrant也支持其他类型的虚拟机系统,例如 kvm, vmware,甚至是容器系统,例如docker,等等。

可以使用Vagrant来干如下这些事:

  • 建立和删除虚拟机
  • 配置虚拟机运行参数
  • 管理虚拟机运行状态
  • 自动配置和安装开发环境
  • 打包和分发虚拟机运行环境

二、安装Vagrant

Vagrant 可以使用不同的后端虚拟机,例如 virtualbox,vmware,kvm,qemu 等。

三、安装到Windows

下载 安装 VirtualBox :https://www.virtualbox.org/

下载安装 Vagrant :http://www.vagrantup.com/

下载所需的 Boxes :http://www.vagrantbox.es/

首先依次安装 Virtualbox 和 Vagrant,视情况重启系统。

四、准备Boxes

Vagrant 的 box,是一个打包好的单一文件,其中包含了一个完整系统的虚拟机相关数据。

添加box的方法很简单,例如Ubuntu 的box:

vagrant box add ubuntu/xenial64 ubuntu-xenial64-20170503.1.0-virtualbox.box

vagrant box add ubuntu/trusty64 ubuntu-trusty64-20170424.0.0-virtualbox.box

可以直接添加box,vagrant会尝试自动下载:

vagrant box add chef/centos-6.5

或者在初始化新vm时直接指定来源地址:

vagrant init ubuntu/trusty64 https://atlas.hashicorp.com/ubuntu/boxes/trusty64

查看所有已经添加的boxes:

vagrant box list

五、基本操作

首先,需要建立一个工作目录;

    cd %HOME%
mkdir -p vms\first-vm
cd vms\first-vm

然后,初始化操作系统:

vagrant init ubuntu/xenial64

启动虚拟机并使用:

vagrant up         #启动虚机
vagrant halt #停止虚机
vagrant destroy [-f] #删除虚机

六、Vagrant常用命令

vagrant init [name [url]]        # 初始化当前目录到 vagrant 环境
vagrant up # 启动虚拟机
vagrant halt # 关闭虚拟机
vagrant reload # 重启虚拟机
vagrant status # 查看虚拟机运行状态
vagrant destroy [-f] # 销毁当前虚拟机(但不删除Vagrantfile)
vagrant suspend # 挂起当前虚拟机
vagrant resume # 恢复被挂起的vm vagrant ssh # SSH 登录至虚拟机 vagrant box add ADDRESS # 安装box文件/url到本地
vagrant box list # 列出所有本地已安装的box列表
vagrant box outdated # 检查已安装的box是否有更新的版本
vagrant box remove NAME # 删除某个已安装的box vagrant package # 打包当前虚拟机环境为box文件以用于分发
vagrant plugin # 安装卸载vagrant插件
vagrant provision # 执行专门的环境初始化脚本
vagrant ssh-config # 输出ssh连接的一些信息
vagrant version # 获取vagrant的版本

七、Vagrantfile

7.1 box

config.vm.box = "ubuntu/xenial64"

指定操作系统。

对于 VirtualBox来说,它提供了 VBoxManage 命令行工具可以针对某个 VM 做很多事,modifyvm 就是一条可以修订 VM 配置参数的子命令。而Vagrant也可以在配置文件 Vagrantfile 中操作 virtualbox 以达到类似的目的。例如:

  config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "bastion", "--memory", "2048"]
end

7.2 网络设置

默认情况下,vagrant通知provider创建 NAT 类型的网卡,这样虚拟机将能够和主机之间相互通讯,同时VM能够借助宿主机的外网环境直接访问公网。

在这种情况下,我们可以指定VM的端口转发来暴露VM中的应用程序的端口,从而在宿主机上可以直接与该端口进行通信。

config.vm.network "forwarded_port", guest: 80, host: 8080

例如,我们在VM中安装了nginx的话,上面的端口转发设定可以将其暴露为宿主机的 :8080 ,这样我们从宿主机或者内网的其他主机都可以访问VM中的nginx服务了。

7.3 同步文件夹

config.vm.synced_folder "../data", "/vagrant_data"

将宿主机的 VM工作目录/…/data 映射为 VM中的 /vagrant_data。

7.4 使用ruby循环语句建立多个 VMs

(1..3).each do |i|
config.vm.define "node-#{i}" do |node|
node.vm.provision "shell",
inline: "echo hello from node #{i}"
end
end

7.5 替换 VM 的 Locale

一般情况下,SSH会话沿用宿主机控制台的Locale,但你可以通过预定义覆盖它,在会话中总是使用特定的语言:

ENV["LC_ALL"] = "en_US.UTF-8"

Vagrant.configure("2") do |config|
# ...
end

7.6 Provisioning

,Provisioning是一个首次启动时的后初始化点,它发生在 VM 操作系统被安装就绪,并首次启动完成时。你可以编写 Shell 脚本在这个点自动完成你的专属环境初始化动作,例如安装标准服务、安装bash扩展组件(例如git-prompt)、建立必要的工作文件夹和拉取特定的分发包之类。

如果有必要,在今后,即使VM已经完成了首次初始化了,你也可以通过 vagrant up --provision 这样的指令来强制 VM 开机和再次执行 Provisioning 脚本。

在 Vagrantfile 中,典型地可以这样指定 Provioning:

$script = <<-SCRIPT
echo I am provisioning...
date > /etc/vagrant_provisioned_at
SCRIPT Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: $script
end

也可以指定一个脚本文件,注意我们通过 /vagrant 传递 provision.sh 到 VM 中,而典型的 box 系统中,/vagrant 是在 $PATH 搜索路径中的:

Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "provision.sh"
end

最新文章

  1. css_随笔
  2. RocksDB安装
  3. nodejs+express中设置登录拦截器
  4. leetcode:Partition List
  5. Android自己主动化測试之Monkeyrunner用法及实例
  6. KVC与KVO理解
  7. redis集群搭建实践
  8. 【转】DMA和cache一致性
  9. jquery Dialog弹框插件
  10. asp.net core系列 30 EF管理数据库架构--必备知识 迁移
  11. 查看oracle当前的连接数
  12. 如何添加使用echats地图悬浮显示内容
  13. 基于redis的 分布式锁 Java实现
  14. Digital Twin的8种解读!
  15. Python中生成器和迭代器的区别(代码在Python3.5下测试):
  16. SQL Server 调优系列基础篇 - 索引运算总结
  17. 最大团 HDU-1530
  18. [转]SSRS: Checking for Divide By Zero Using Custom Code
  19. php获取指定div内容
  20. Centos查看端口占用和关闭端口

热门文章

  1. 使用docker制作Mysql镜像
  2. 动态方法拦截(AOP)的N种解决方案
  3. .Net微服务实战之负载均衡(下)
  4. NP问题/NP完全问题(NP-complete problem)如何判断是否是NP完全问题
  5. 快速了解JavaScript的基础知识
  6. Java的nanoTime()方法
  7. LeetCode106 从中序和后序序列构造二叉树
  8. Dubbo 配置的加载流程
  9. Haproxy-1.8.20 根据路径(URI)转发到后端不同集群
  10. 【Oracle】CBO优化详解