问题描述
1、虚拟化工具学习成本高
2、环境无法直接共享
3、虚拟化平台不统一
4、无法快速保存、还原某版本测试环境
解决方案:Vagrant
1、可以很方便的就建立起来一个虚拟环境
2、可以很快速的就把某版本的测试环境还原出来
3、可配置、轻量级、便携式
4、可共享,降低了开发者搭建环境的时间,提高了生产力
5、解决了 “在我的机器上可以工作” 的问题
6、跨平台,支持多操作系统,多款虚拟化平台
7、模拟分布式系统
8、命令行模式,适合做 DevOps
安装包及 Box 的选择
安装包:https://www.vagrantup.com/
Boxes: http://www.vagrantbox.es/
Box 推荐选择:minimal + guest additions + puppet|chef 的 box
基础命令及操作
基础命令:
$ vagrant init # 初始化
$ vagrant up # 启动虚拟机
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant ssh # SSH 至虚拟机
$ vagrant suspend # 挂起虚拟机
$ vagrant resume # 唤醒虚拟机
$ vagrant status # 查看虚拟机运行状态
$ vagrant destroy # 销毁当前虚拟机
Box 管理:
$ vagrant box list # 查看本地 box 列表
$ vagrant box add # 添加 box 到列表
$ vagrant box remove # 从 box 列表移除
一般操作:
1、添加 Box:vagrant box add【name】box 路径
2、初始化:Vagrant init centos7,修改 OR 替换配置文件
3、启动:Vagrant up
4、登录并使用:Vagrant ssh
Provider 的选择
vagrant 支持多种类型的虚拟化平台,默认平台为 VirtualBox,如果选择其他平台,需要加以下参数:
$ vagrant up --provider hyperv
网络设置
Vagrant 可以指定三种网络,他们和多数虚拟机提供的网络是对应的。
端口转发(Forwarded Ports)
私有网络(Private Network)
公有网络(Public Network)
三种网络类型分别由 NAT、桥接、内部、主机模式组合而成,视频中会做具体讲解,这里由于篇幅关系就不再累述。
端口转发(Forwarded Ports)
config.vm.network :forwarded_port, guest: 80, host: 8080
将虚拟机的端口 80 映射为宿主机的端口 8080
优点:
简单易理解
容易实现外网访问虚拟机
缺点:
如果一两个端口需要映射很容易,但是如果有有很多端口,比如 MySQL,MongoDB,tomcat 等服务,端口比较多时,就比较麻烦。容易占用端口。
私有网络(Private Network)
config.vm.network "private_network", ip: "192.168.50.4"
config.vm.network "private_network", type: "dhcp"
只有主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问,当然虚拟机是可以访问外部网络的。
优点:
安全,只有自己能访问。
缺点:
因为私有的原因,所以团队成员其他人不能和你协作。
公有网络(Public Network)
config.vm.network "public_network", ip: "192.168.1.120"
config.vm.network "public_network"(默认使用 dhcp 分配)
虚拟机享受实体机器一样的待遇,一样的网络配置。
优点:
方便团队协作,别人可以访问你的虚拟机。
缺点:
需要有网络,有路由器分配 IP。
如果 Host 机器有多张网卡,此时运行 vagrant up, Vagrant 会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在 Vagrantfile 中进行配置,语法如下:
config.vm.network "public_network", :bridge => 'en1: Wi-Fi (DLINK)'
Provision
--provision / --no-provision
什么时候会执行:
首次执行 vagrant up
执行 vagrant provision
执行 vagrant reload –provision
也可以做配置使之每次执行:
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo hello",
run: "always"
end
两种执行方式:
1、直接在 Vagrantfile 中编写 Shell 脚本,可以通过 “inline” 指定脚本内容:
Vagrant.configure("2") do |config|
# ... other configuration
config.vm.provision "shell", inline: "echo hello"
end
2、 通过引用外部脚本文件的方式:
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "script.sh"
end
Package
打包共享自制的 box:
vagrant package –-base virtualbox_vm_name --output newbox_name.box