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 | 插件列表 |