独立开发者训练营现在报名,享受优惠立即启程

路径(七):用 Vagrant 管理虚拟机

我们需要一种更好的管理虚拟机的方法。比如你可能想创建几个 Linux 系统的虚拟机,因为你开发的项目最终是要运行在 Linux 系统的服务器上。所以,你打算在本地也用 Linux 系统为项目搭建一个开发环境,手工去安装不同类型的 Linux 操作系统太麻烦了。你需要 Vagrant。

Vagrant 可以让我们用命令直接从云上下载虚拟机的镜像,你想要什么系统都行,Centos,Ubunto ...   只需要一行命令,然后再用命令去操作虚拟机,启动,暂停,关闭,重启,你可以更方便的管理所有的在本地上电脑上的虚拟机镜像,手工去配置它们,可以再重新打包成新的镜像,方便你跟你的团队在其它的项目上重复使用。

安装 Vagrant

Vagrant 提供了一个虚拟机的管理层,虚拟机本身还是需要用到虚拟机的软件,比如 VMware,Virtualbox 等等,推荐用 Virtualbox 。使用系统的包管理工具去安装软件。

Windows 上安装 Vagrant

choco install vagrant

Windows 上安装 Virtualbox

choco install virtualbox

Mac 上安装 Vagrant

brew install vagrant

Mac 上安装 Virtualbox

brew install Caskroom/cask/virtualbox

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 位的操作系统,请执行:

vagrant 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 列表。

vagrant box list

手工下载并添加 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,传到了百度云盘上。
http://pan.baidu.com/s/1qWmc18S

管理 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 用户要用 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

评论

轻轻松松就成功了,前后只花10分钟。box在云盘上,几分钟就下好了,比vagrantcloud快多了。

PS C:\Windows\system32> vagrant box add chef/centos-6.5-i386
无法将“vagrant”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然
后重试。
所在位置 行:1 字符: 8
+ vagrant <<<< box add chef/centos-6.5-i386
+ CategoryInfo : ObjectNotFound: (vagrant:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
王老师,这要怎么办呢

我看了下,原因是在你的 Powershell 上面还不能运行 vagrant 命令,先确定已经安装好了 vagrant ,比如用 choco install vagrant 来安装。完成以后,你得关掉 Powershell ,再重新打开它。再试一下执行 vagrant 命令,看一下有没有反应。

一开始我也有这个情况,解决办法是重启一遍电脑 就好了
WIN7 64位

vagrant init centos-6.5
如果從Atlas下載的Box的話,應該用
vagrant init chef/centos-6.5

感谢提醒,嘿嘿。因为从 atlas 上面下载的慢,我就推荐可以使用下载工具,去 box 下载到本地,然后再手工添加到 box 的列表里。在手工添加的时候,为 box 起的名字是 centos-6.5 。不管怎么样,在初始化的时候,可以先用 vagrant box list 查看一下可用的 box 列表。

ssh的端口号不是2222么?这里写的2200

SSH 的端口号是 22 ,Vagrant 用到了端口转发,注意,我们 SSH 的是 127.0.0.1 ,而我们真正想要干的是连接到虚拟机。

这个端口转发不太懂,我的就是在putty里的端口号直接输2222就连上虚拟机了,要是本地机器里有多个虚拟机同时启动,所填的端口还是2222?

我看了第九课的端口转发了,是不是连接ssh的22端口也被转发到2222了?但是我并没有设置转发啊

brew install vagrant
这样真的能下载vagrant嚒?

这样不行,因为 vagrant 属于 Caskroom 的包,Homebrew 本身只适合去安装在命令行下面用的工具,后来 Caskroom 扩展了 Homebrew 可以安装的东西,比如一些图形界面的软件。你可以先安装一下 Caskroom,brew install caskroom/cask/brew-cask ,然后再去安装 Caskroom 包的时候,你就可以这样做,比如去安装 Vagrant: brew cask install vagrant 。

PS D:\工作文件\vagrant\nazf.net_home> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7.0_nazf'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: nazfnet_home_default_1427381920843_31923
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...

我看到你的项目路径里面有中文字符,会不会是这个问题啊。还有就是,如果你的电脑是 64 位的,才能使用 64 位的 box,不然只能使用 32 位的 box 。

遇到一个小问题:
PS C:\Users\G.Raid0c\desktop\v=test> vagrant up
Bringing machine 'default' up with 'hyperv' provider...
==> default: Verifying Hyper-V is enabled...

查了很多地方,得不到解决,请指点迷津~~~~多谢多谢~

停在这个地方不动了..

Hyper-V 是不是一个选项,你需要在电脑主板上打开。

了解了,Hyper-V是Win8系统内置的,我用的Win7中没有这个功能.解决办法查了下需要使用win7\x86fre_GRMRSAT_MSU.msu安装KB951636这个更新,我没有试验是不是能成功,我换了别的系统...

我是win7 64位系统,启动box的时候卡在了Bringing machine 'default' up with 'hyperv' provider...上面,不知道怎么设置了。。

原因可能是这个 hyperv ,这东西好像是电脑系统的一个选项,你可以搜搜看,怎么打开或关闭这个选项。还有您的系统是 Win 10 吗?如果是,好像系统自带一个什么虚拟软件,也需要关闭一下。具体也可以搜一下。

用vagrant为虚拟机配置了公有网络
本机上访问虚拟机的ip地址可以打开网页,但是连到同一个路由器的手机无法访问,这是我什么原因?如何解决

确定是公有网络是吧。也就是虚拟机的内网 ip 地址,跟您电影的 ip 地址在同一网段上。

王皓,我用的是vagrant_1.8.1和VirtualBox-5.0.18,CentOS 7.1。安装完成后,有两个问题:
1.同步问题,本机目录与vagrant虚拟机目录不能自动同步,必须退出vagrant(exit), 再重启vagrant reload,本地新建的目录和文件同步到虚拟机相应的位置上了。怎么自动同步呢?
与默认网站根目录是/var/www/html。将其改为/home/vagrant/sync/www的

怎么就发上去了,还没有写完呢!
王皓,我用的是vagrant_1.8.1和VirtualBox-5.0.18,CentOS 7.1。安装完成后,有两个问题:
1.同步问题,本机目录与vagrant虚拟机目录不能自动同步,必须退出vagrant(exit), 再重启vagrant reload,本地新建的目录和文件同步到虚拟机相应的位置上了。怎么自动同步呢?
2.网站根目录问题。安装后网站根目录默认是/var/www/html,怎样将其改为/home/vagrant/sync/www。修改配置文件修改sudo vim /etc/httpd/conf/httpd.conf,
把所有 /var/www 改为 /home/vagrant/sync
把所有 /var/www/html 改为 /home/vagrant/sync/www

保存,
sudo service httpd restart //重新启动
坏了!
403错误
Forbidden
You don't have permission to access / on this server
改用户和组为root也不行。
怎么办啊?

皓哥您好,冒昧地问您一个问题:在添加了box之后,执行vagrant up命令,总是重复出现以下错误:
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "e018b6ff-2f1a-4e0d-8d40-47b04c6694c2", "--type", "headless"]

升级 vagrant,virtualbox 试试吧。

好,谢谢皓哥,试一下。

皓哥,还是出现同样的错误,我再想想办法。

Putty无法连接, 网上搜遍无法解决,connection refused 或 connction abort, 怎么解决?

这样试一下,去下载 Git ,安装的时候可以选择安装常用的 Bash 工具,这样应该就可以直接在命令行下面使用 ssh 工具了,也就是你可以直接 vagrant ssh 到你的虚拟机。或者 ssh 用户@IP地址 ,连接到你的服务器。

https://git-scm.com/downloads

实在不行,换成 Linux 桌面系统如何?比如 http://cn.ubuntu.com/

事先在 Mac 上使用 Parallesls Desktop 12 安装好了 CentOS 7,不知道从哪一步进入。。。。🤣🤣

您好 我想问下vagrant up 出现 The box 'ubuntu/xebual64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Vagrant Cloud, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:
URL: ["https://vagrantcloud.com/ubuntu/xebual64"]
Error: The requested URL returned error: 404 Not Found这个问题出现在哪里或者怎么解决呢 研究一晚上了 天都亮了 求大神给讲解一下 谢谢您 膜拜膜拜

问题是这个box不存在,换一个box吧,你可以搜索vagrant box,找到他的官方网站,然后在找到自己需要的box。

好的 谢谢大佬



微信好友

用微信扫描二维码,
加我好友。



微信公众号

用微信扫描二维码,
订阅宁皓网公众号。



240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

13432
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点