文章目录[隐藏]
vagrant 是一个非常好用的工具,可以用它来在单台物理机器编程管理多个虚拟机(vms)。其支持原生VirtualBox,Vagrant 可以让我们用命令直接从云上下载虚拟机的镜像,你想要什么系统都行,Centos,Ubunto ... 只需要一行命令,然后再用命令去操作虚拟机,启动,暂停,关闭,重启,你可以更方便的管理所有的在本地上电脑上的虚拟机镜像,手工去配置它们,可以再重新打包成新的镜像,方便你跟你的团队在其它的项目上重复使用。
这些虚拟镜像就是别人配置好的Linux系统,比如Centos-6.5,Centos7.0,也就是BOX,
下载安装
下载安装 Vagrant :http://www.vagrantup.com/
下载安装 virtualbox :https://www.virtualbox.org/wiki/Downloads
安装 Vagrant
注意:这里使用Chocolatey
进行安装的,建议你先阅读 windows命令行软件管理包系统Chocolatey 安装使用教程
Windows 上安装 Vagrant
choco install vagrant
Windows 上安装 Virtualbox
choco install virtualbox
Mac 上安装 Vagrant
brew install vagrant
Mac 上安装 Virtualbox
brew install Caskroom/cask/virtualbox
我们学习一下ninghao.net对Box阐述
Box ,你可以把它想成是一个箱子,里面装了一些东西。在用 Vagrant 创建虚拟机的时候,需要用到 Box ,它里面会包装操作系统的镜像,不同的 Box 带的操作系统可能是不一样的,比如 CentOS,Ubuntu 等等,你可以基于它们去创建自己版本的 Box,比如在虚拟机上安装一些软件,然后把它重新打包成 Box 。
在 Vagrant 提供的云服务(https://vagrantcloud.com/)上面可以下载到别人做好的 Box,这个云服务现在叫 Atlas,是 hashicorp 公司的一个产品,Vagrant 也是这家公司的项目。打开这个地址以后,可以去搜索想要用的 Box,可以搜索操作系统的名字,也可以搜索特定的软件的名字,比如 Laravel,Drupal ... 在搜索结果上面会显示这个 Box 的下载的次数,你可以用来判断这个 Box 是否受欢迎。
我们需要一个纯净的 Box,就是只包含操作系统,在系统上没有安装其它的多余的东西。注意不同发行版的 Linux 操作起来是有些区别的,我推荐先用一下 CentOS 这款操作系统。
添加 Box
把 Box 下载到本地的电脑上,交给 Vagrant 去管理,这样在创建虚拟机的时候,Vagrant 会复制一份你指定的 Box 到你的项目里面,这样你在这个虚拟机上的操作,就不会影响到其它的项目。先确定你用的电脑上的操作系统的位数,现在一般都是 64 位的操作系统。打开命令行工具以后,执行 vagrant box add 命令去添加 Box 。
vagrant box add 名字
如果你指定的 Box 在本地电脑上不存在,Vagrant 就会到它的云上去给你下载。执行:
vagrant box add chef/centos-6.5
如果是 32 位的操作系统,请执行:
agrant box add chef/centos-6.5-i386
上面的 chef/centos-6.5 还有 centos-6.5-i386 就是想要添加的 Box 的名字,最前面的 chef ,是一个命名空间,一般就是这个 Box 的作者的名字,后面的 centos-6.5 表示这个 Box 的操作系统是 CentOS ,版本是 6.5 ,i386 表示 32 位的系统。
$ vagrant box add chef/centos-6.5 ==> box: Loading metadata for box 'chef/centos-6.5' box: URL: https://atlas.hashicorp.com/chef/centos-6.5 This box can work with multiple providers! The providers that it can work with are listed below. Please review the list and choose the provider you will be working with. 1) virtualbox 2) vmware_desktop Enter your choice:
Vagrant 在本地没找到你要添加的 Box,它会到云上去给你下载,它会先提示让你选择 Box 的版本,有用在 Virtualbox 上的 Box ,还有用在 VMware 上的 Box,选择哪个取决于你系统上安装的虚拟机的软件是什么,如果你按照我的步骤,安装的应该是 Virtualbox ,所以,选择要选择 1 ,然后回车,继续执行命名
查看本地上的 Box 列表
完成以后,可以查看一下在本地上的 Box 列表。
手工下载并添加 Box 的方法
在执行 Vagrant box add 添加 Box 的时候,Vagrant 会在命令行上显示 Box 的下载地址,下载的速度还有进度,如果你在国内,很可能下载的速度非常慢。你可以复制 Box 的下载地址,然后用下载工具,比如用迅雷去下载。在 Powershell 上面复制,可以先选中要复制的东西,然后按一下回车,再打开迅雷,粘贴下载的地址去下载 Box 。
完成以后,找到下载下来的文件,文件名里会包含 .box 这个扩展名,如果不是,你需要手工添加这个扩展名。并且重命名一下文件,比如命名为 centos_6.5.box 。然后把它放到桌面上,其它地方也行。打开命令行,进入到手工下面的 Box 文件所在的位置。比如
cd ~/desktop
然后查看一下文件列表:
ls
确定 Box 文件在当前的目录的下面,再执行 vagrant box add 命令去手工添加 Box 。
vagrant box add 名称 路径
名称就是你想给这个 Box 起的名字,以后我们会用到这个名字去管理这个 Box,路径是 Box 文件所在的位置,如果你要添加的 Box 直接在你当前所在的目录的下面,可以直接使用 Box 文件的名称,像这样:
vagrant box add centos-6.5 centos-6.5.box
Vagrant 会把 Box 文件复制到系统的某个特定的目录的下面,完成以后,你就可以把桌面上的 Box 文件删除掉了。
rm centos-6.5.box
再查看一下可用的 Box 列表:
vagrant box list
在返回的列表里,你应该可以找到自己手工添加的 centos-6.5 这个 Box 。
管理 Box
添加到本地电脑上的 Box 会放到一个特定的目录的下面。跟 Box 相关的命令,可以用 vagrant box 命令查看。使用的方法就是 vagrant box 后面再加上子相应的子命令,接着是对应的参数。常用的就是 add ,list 还有 remove。add 是添加新的 Box ,list 可以查看已有的 Box ,remove 就是从系统中删除掉 Box 。注意在创建虚拟机的时候,Vagrant 会把你指定的 Box 复制一份放到特定的目录的下面。所以,你在使用 remove 命令删除掉添加到系统中的 Box 的时候,不会影响到这些已有的虚拟机。
创建虚拟机
添加了 Box 以后,我们就可以用 Vagrant 基于这个 Box 去创建虚拟机了。先找个地方去创建一个目录,这个目录就是你的项目所在的目录,它会自动跟虚拟机上的某个目录同步,也就是在你电脑上的这个目录里面的文件,你同样可以在虚拟机里的某个目录里面找到。比如我要在桌面上创建一个叫 ninghao-project 的目录,然后再进入到这个目录,在命令行工具下面执行:
cd ~/desktop mkdir ninghao-project cd ninghao-project
初始化
首先要做的就是初始化一下,用 vagrant init ,后面指定一下要使用的 Box 的名字。完成以后,在你的目录下面创建一个叫 Vagrantfile 的文件。
先查看一下可用的 Box
vagrant box list
如果跟着我的步骤来,你应该可以看到一个叫 centos-6.5 的 Box 。下面我们用这个 Box 去初始化一下项目。
vagrant init centos-6.5
完成以后,查看一下当前目录下面的东西。
ls
你会看到一个 Vagrantfile 文件,这个文件是配置当前项目的虚拟机用的,以后我们会再回来看一下怎么样使用这个文件。
启动虚拟机
Vagrant 提供了一些命令可以操作虚拟机,比如启动,暂停,关闭或者销毁虚拟机。启动虚拟机,执行:
vagrant up
第一次启动,花的时间会长一些,因为 Vagrant 会把你为项目指定的 Box 复制到一个地方,然后再去启动它。完成以后,你可以用命令再查看一下虚拟机的状态:
vagrant status
如果返回的是 running ,说明虚拟机启动成功,现在你就可以使用 ssh 连接到虚拟机,去控制它了。
控制虚拟机
想在 Linux 系统的虚拟机上进行操作,你要用 ssh 连接到虚拟机,这跟你远程控制 Linux 的服务器是一样的。如果你是 Mac 用户,可以先进入到项目所在的目录,然后直接用 vagrant ssh ,连接到虚拟机。
Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 等。建议Windows 用户要用 putty
去连接。
Mac
vagrant ssh
Windows
用 vagrant up 启动虚拟机以后,可以接着再输入 vagrant ssh,会出现提示,说没找到 SSH,你可以选择自己喜欢的 SSH 客户端,然后用下面的的信息连接。
Host:127.0.0.1 Port:2200 Username:vagrant
打开 putty 工具以后,连接的类型选择 ssh ,然后输入主机的 IP 地址,127.0.0.1 ,port 端口号输入 2200,点击 连接。这样会打开一个命令行工具,提示你输入用户名,这个用户名就是你想连接的 Linux 系统的用户名,Vagrant 会为虚拟机创建一个叫 vagrant 的用户,这个用户的密码也是 vagrant ,输入用户名,再输入密码以后,就可以成功的连接到 Linux 系统的虚拟机了。
用 Putty 连接虚拟机成功以后,对虚拟机的操作,都是在这个小工具上进行。
使用这种方法,你同样可以去控制在互联网上的 Linux 系统的服务器,打开 putty 的时候,连接的主机输入你的服务器的 IP 地址就可以了,然后是你的服务器的用户名,还有密码。
安装 putty
choco install putty
打开 putty,可以直接在 Powershell 里面输入 putty ,然后回车。
在 Windows 上使用 Vagrant 初始化并连接虚拟机
暂停与恢复
虚拟机在运行的时候会消耗你的电脑资源,比如内存,CPU 等等,在不用它的时候,可以关掉或者使用暂停,暂停虚拟机可以保存虚拟机运行时候的状态,暂停以后,除了占点硬盘空间以外,就不会消耗你的其它资源了。
进入到项目所在的目录,然后可以用 vagrant status 查看一下当前的虚拟机的状态,如果是 running ,你就可以使用命令去暂停一下:
vagrant suspend
重新恢复起动,执行命令:
vagrant resume
想要彻底关掉虚拟机的运行,执行:
vagrant halt
停止以后,要想再起动虚拟机,要执行:
vagrant up
删除虚拟机
不打算再用的虚拟机,可以把它删除掉,直接删除项目的目录是不行的,因为为项目指定的虚拟机并不包含在这个项目的目录下面,需要使用命令去删除虚拟机。进入到项目所在目录,然后执行:
vagrant destroy
当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:
打包分发
$ vagrant package
打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。
小结
1、常用命令
$ vagrant init # 初始化
$ vagrant up # 启动虚拟机
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant ssh # SSH 至虚拟机
$ vagrant status # 查看虚拟机运行状态
$ vagrant destroy # 销毁当前虚拟机
更多内容请查阅官方文档 http://docs.vagrantup.com/v2/cli/index.html
2、Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile 的配置文件,可以修改配置文件进行个性化的定制。
Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile,将下面这行的注释去掉(移除 #)并保存:
config.vm.network :private_network, ip: "192.168.33.10"
重启虚拟机,这样我们就能用 192.168.33.10 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。
3、注意事项
使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:
# Apache 配置添加:
EnableSendfile off
# Nginx 配置添加:
sendfile off;
4、参考文章
- ▶ http://ninghao.net/blog/2077
- ▶ https://segmentfault.com/a/1190000000264347