
Vagrant 是一个管理虚拟机环境的工具 。它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境。
Vagrant 底层支持VirtualBox、VMware甚至AWS作为虚拟机系统,这里使用VirtualBox来进行说明,所以第一步需要先安裝Vagrant和VirtualBox。
安装VirtualBox
VirtualBox是Oracle开源的虚拟化系统,到 VirtualBox 官网 下载 VirtualBox ,virtualBox 的安装十分简单,直接略过。
安装Vagrant
到 Vagrant官网 根据自己系统选择对应版本下载并安装,安装过程十分简单,直接下一步就ok了。
要想检测安装是否成功,可以打开终端命令行工具,输入vagrant -c,看看程序是不是已经可以运行了。如果不行,请检查一下$PATH里面是否包含vagrant所在的路径。
vagrant -v
# Vagrant 2.2.6
如果看到输出,表示已经装好了,我这里安装的是2.2.6的版本。
如果下载速度比较慢,可以将下载链接复制到迅雷来下载
Box
当我们安装好 VirtualBox 和 Vagrant 后,我们要开始考虑在 VM 上使用什么操作系统了,一个打包好的操作系统在 Vagrant 中称为 Box, Box 是一个打包好的操作系统环境 。
box文件的后缀为.box。包含了虚拟机配置、虚拟机硬盘镜像和Vagrant配置的压缩包。
Box相当于帮我们完成了下载iso安装镜像,新建虚拟机然后配置cpu、内存、光驱、网络等信息,再从光驱启动并安装,完成后还要安装虚拟机增强工具、配置系统、映射端口、映射磁盘目录等工作。
有了封装好的Boxes,就可以快速的搭建所需要的系统环境了。
理解了box是什么东西之后,现在要开始安装操作系统了,在 app.vagrantup.com 上面有大家熟知的大多数操作系统,可以选择先下载或者使用的时候通过vagrant在线下载都可以。
如果下载速度比较慢,可以将下载链接复制到迅雷来下载
关于Vagrant也可以通过官方提供的 Getting Started 来学习。
开始
建立工作目录
我的开发机是linux,建立了如下的开发目录。
/home/User/vagrant
可以根据自己的操作系统创建合适的操作目录。
初始化
进入工作目录,打开终端执行vagrant初始化的命令。
vagrant init centos/7
# A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up`
# your first virtual environment! Please read the comments in the Vagrantfile as well
# as documentation on `vagrantup.com` for more information on using Vagrant.
运行上面的命令后,Vagrant 会在工作目录下创建 Vagrantfile 配置文件,打开它在第15行可以看到下面config.vm.box="centos/7",作用是配置当前 Vagrant 环境使用哪个 Boxes。
centos/7是一个公开Boxes,更多公开Boxes可以在 这里 找到。

启动虚拟机
vagrant up
在工作目录中执行上面的命令,Vagrant 会尝试加载并启动这个虚拟机,但此时虚拟机还没创建。
Vagrant会根据 config.vm.box 配置查看本机是否已经存在 centos/7 对应的 Boxes,如果本机没有就去远端仓库下载。下载完成之后直接从本地加载就可以了。
vagrant up
#/opt/vagrant/embedded/gems/2.2.6/gems/vagrant-2.2.6/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /opt/java/jdk1.8/bin in PATH, mode 040777 Bringing machine 'default' up with 'virtualbox' provider...
#==> default: Box 'centos/7' could not be found. Attempting to find and install...
# default: Box Provider: virtualbox
# default: Box Version: >= 0
#==> default: Loading metadata for box 'centos/7'
# default: URL: https://vagrantcloud.com/centos/7
#==> default: Adding box 'centos/7' (v1905.1) for provider: virtualbox
# default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box
# default: Download redirected to host: cloud.centos.org
# default: Progress: 16% (Rate: 1045k/s, Estimated time remaining: 0:04:47)
注意:如果速度很慢,可以复制出具体的
.box文件 URL 并终止这次命令,改用其他工具(比如某迅某雷之类的)下载。
下载完成之后,可以通过两种方式来启动下载的box文件。(这里假设.box文件被下载到~/User/vagrant/centos/centos7.box)
- 方式一:打开 VagrantFile,修改 config.vm.box 配置为本地文件
config.vm.box = "~/User/vagrant/centos/centos7.box"。
现在再执行vagrant up就会从本地加载Boxes,稍等片刻虚拟机就启动就好了。- 方式二:将下载的
.box文件添加到vagrant中。使用vagrant box add 镜像别名 镜像path命令来添加,这里执行vagrant box add centos/7 ~/User/vagrant/centos/centos7.box就可以完成添加了。
然后可以通过vagrant box list来查看当前拥有的box列表。
现在再执行vagrant up就会从本地加载Boxes,稍等片刻虚拟机就启动就好了。
如上面的操作一切正常,vagrant会在virtualBox上自动的配置一个系统,然后自动后台启动,我们无需介入。
连接到虚拟机
Vagrant 环境创建并启动后,在工作目录下,可以通过 vagrant ssh 进入这个虚拟机环境。通常不需要输入帐号密码就可以登录,登录之后的用户名是 vagrant(可以通过登陆后,通过whoami命令查看),密码也是 vagrant。这个帐号执行 sudo 不需要输入密码,因为封装 Boxes 时已经做了相应处理。
这样我们就可以像连接到一台服务器一样进行操作了。
共享文件夹
虚拟机环境配好后,主机的 Vagrant 工作目录(Vagrantfile文件所在的目录)会被自动映射到虚拟机的 /vagrant 目录。所以当我们需要和虚拟机共享文件的时候,直接将文件放置到Vagrant 的工作目录即可。
这样在Vagrant工作目录操作本地文件,就相当于操作虚拟机,非常方便。
Vagrantfile配置文件详解
在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括虚拟机的配置、SSH配置、网络的配置等。
修改完
Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置
box设置
config.vm.box = "base"
# 设置 centos/7 box 的版本,如果不指定,下载最新的
config.vm.box_version = "20161209.0.0"
上面的配置用来展示Vagrant要启用那个box作为系统,也就是上面vagrant init BOX_NAME时所指定的box,如果沒有输入box名称的話,那么默认就是base。
网络设置
关于网络设置这块,在网上看到一篇文章写的很详细 参见这里
远程连接虚拟主机,参考这里 如何通过xshell等工具连接vagrant中的centos主机
hostname设置
hostname的设置非常简单,Vagrantfile中加入下面这行就可以了:
config.vm.hostname = "go-app"
设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的。
同步目录
/vagrant的同步目录默认就是当前的开发目录,这是在虚拟机开启的时候默认挂载同步的。
此外还可以通过配置来设置额外的同步目录,我这里在Vagrantfile的46行,打开注释修改一下即可。
config.vm.synced_folder "../data", "/vagrant_data",create:true,
disabled:false,owner:"root",group:"root"
上面这个设定,第一个参数是主机的目录,第二个参数是虚拟机挂载的目录,create 表示如果主机目录不存在,则创建主机目录,默认为false,disable 表示是否禁用同步文件夹,默认为 false;owner 和 group 定义所有者/组
端口转发
下面两个配置,我这里在Vagrantfile的26和31行行,打开注释修改一下即可。
config.vm.network "forwarded_port", guest: 80, host: 8080
这一行的意思是把对宿主机器上8080端口的访问请求forward到虚拟机的80端口的服务上,这样Vagrant就会把这个请求转发到VM里面跑在80端口的nginx服务上,因此我们可以通过这个设置来帮助我们去设定host和VM之间,或是VM和VM之间的信息交互。
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
默认映射到宿主机的端口是可以允许公众访问的,通过指定host_ip为127.0.0.1来禁止公众访问。极少用这个设置。
修改完
Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置
配置VirtualBox内存、CPU等
进入虚拟机后,用 free -hm 命令查看虚拟机内存大小及使用情况。
可以看到虚拟机的默认内存还不到500M,可以通过一下配置来修改虚拟机占用的内存。我这里在配置文件的第52~57行。
config.vm.provider "virtualbox" do |vb|
# vagrant up启动时,是否自动打开virtual box的窗口,缺省为false
# vb.gui = true
#指定vm-name,也就是virtualbox管理控制台中的虚机名称
vb.name = "centos7"
#指定vm内存,单位为MB
vb.memory = "700"
#设置CPU个数
vb.cpus = 2
end
集成预执行
有时候,我们希望vagrant启动后,可以自动执行一些任务,这些任务也是可以通过Vagrantfile来定义的。打开 Vagrantfile 文件末尾处有下面被注释的代码:
config.vm.provision "shell", inline: <<-SHELL
echo ${SHELL}
echo "hello Vagrant"
SHELL
这段代码是用来预定义在vagrant up后,自动执行的任务的,配置方式时通过shell命令。
完成设置之后执行vagrant up --provision或者 vagrant reload --provision 就可以生效了。
还可以将要运行的命令单独写一个脚本文件,比如 init.sh,并保存在和Vagrantfile同目录。
#!/usr/bin/env bash
echo "以下是 vagrant provision 输出的内容"
echo ${SHELL}
echo "hello Vagrant"
然后修改 Vagrantfile 。
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
...
# 修改为这样
config.vm.provision "shell", path: "init.sh"
end
完成修改后执行 vagrant reload --provision 。
打包并分发自定义的box
当你配置好需要的环境后,退出并关闭虚拟机。
vagrant halt
在终端里对开发环境进行打包。
vagrant package --output first-docker-centos7.box
打包完成后会在当前目录生成一个 first-docker-centos7.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 。
vagrant box add first-docker-centos7 first-docker-centos7.box
并用其初始化自己的开发目录就能得到一个一模一样的环境了。
vagrant init first-docker-centos7
vagrant up
# 此时可以得到和之前一模一样的环境,但是网络要重新配置
也可以通过
vagrant package --vagrantfile Vagrantfile将VagrantFile也打包进去
通过vagrant package --base NAMA命令可以打包一个由VirtualBox管理的虚拟机,NAME应该是VirtualBox界面中的计算机名称或者UUID,目前支持VirtualBox虚拟机的导出
常用的命令
命令列表很无聊,记性很不靠谱!
| 命令 | 功能 |
|---|---|
vagrant validate | 验证 Vagrantfile |
vagrant box add NAME URL | 添加一个 box |
vagrant box list | 查看本地box列表 |
vagrant box remove NAME virtualbox | 删除本地已添加的 box |
vagrant init NAME | 初始化,实质应是创建 Vagrantfile 文件 |
vagrant global-status | 获取所有虚拟机的状态 |
vagrant status | 获取当前虚拟机的状态 |
vagrant up [name|id] | 启动虚拟机 |
vagrant halt | 关闭虚拟机 |
vagrant suspend [name|id] | 挂起当前的虚拟机 |
vagrant resume [name|id] | 恢复前面被挂起的状态 |
vagrant destroy | 停止当前正在运行的虚拟机并销毁所有创建的资源 |
vagrant reload [name|id] | 重新启动虚拟机,主要用于重新载入配置文件 |
vagrant package | 当前正在运行的 VirtualBox 虚拟环境打包成一个可重复使用的 box |
vagrant ssh [name|id] | 进入虚拟环境 |
vagrant ssh-config [name|id] | 读取ssh配置文件的有效配置 |
vagrant plugin install [PLUGIN_NAME | /path/to/my-plugin.gem] | 安装插件,--local仅将插件安装到本地项目 |
vagrant plugin update [<PLUGIN_NAME>] | 更新插件,如果有名字,则只更新指定名称的插件 |
vagrant plugin expunge | 删除所有用户安装的插件,参数有--force、--global-only、--reinstall(删除后尝试重新安装插件)等 |
vagrant plugin uninstall <plugin_name1> [<plugin_name2 <plugin_name3> ...] | 移除插件PLUGIN_NAME |
vagrant plugin list | 插件列表 |