Vagrant 基础全面解析

这篇 Vagrant 入门文章将带你建立一个 Vagrant 项目,这个过程将会用到 Vagrant 所提供的主要基本特性。若是想了解 Vagrant 能为你带来哪些好处,能够阅读 Vagrant 官网文档的  "Why Vagrant?" 部分。html

Vagrantweb

Vagrant 是一个管理虚拟主机生命周期的命令行工具。本文旨在从上到下对 Vagrant 各个特性进行全面讲解,尽量多的涵盖细节。若是你只是想入门 Vagrant ,那么本文是一个很是好的开始。shell

本文将会使用到 VirtualBox,由于它在各个主要的操做系统平台上都是免费的,而且已集成到 Vagrant 中。不过,在读完文档后,请不要忘记 Vagrant 还能够配合不少其余虚拟机平台一块儿工做。apache

在深刻第一个 Vagrant 项目以前,请安装最新版本的 Vagrant ,而且安装好 VirtualBox,由于后续环节咱们会把 VirtualBox 做为咱们的 provider 进行主要讲解。bootstrap

若是你更喜欢阅读纸质书本, 《Vagrant: Up and Running》 多是一个不错的选择,该书已在 O'Reilly 出版,其做者正是 Vagrant 的做者。ubuntu

#1 - UP AND RUNNING

$ vagrant init hashicorp/precise64
$ vagrant up

运行上面两条命令后,一个基于 VirtualBox 的虚拟主机(Ubuntu12.04 LTS 64-bit)将运行起来。你能够经过 vagrant ssh 命令以 SSH 的形式登陆到虚拟主机,处理完你的工做后,可经过`vagrant destroy` 命令终止虚拟主机运行。浏览器

如今,想象一下你的每个项目都可以如此容易的创建!在 Vagrant 中,只需执行一条 `vagrant up` 命令,项目依赖安装、网络配置、文件夹同步等工做都会准备完成。你能够很是方便的基于你的物理机进行工做。bash

本文的其他部分将经过引导您创建一个比较完整的项目,来介绍更多 Vagrant 特性。服务器

#2 - PROJECT SETUP

要配置一个 Vagrant 项目,首先需建立 Vagrantfile 文件,Vagrantfile 文件所在目录就是项目根目录:网络

1. 记下你的项目根目录。许多 Vagrant 配置选项都是相对于这个根目录的。
1. 描述运行项目所需的机器和资源,以及要安装什么软件和如何访问它。

Vagrant 内置了初始化文件夹为 Vagrant 项目的命令 vagrant init 。在命令行执行下列命令:

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

上述命令将在当前工做目录中生成一个 Vagrantfile 文件。你能够打开该文件看一看,里面有一些被注释掉的案例。不要惧怕,若是看起来很吓人,咱们会很快修改[引用官方原话]。你也能够在一个已存在的目录中运行 vagrant init,将其初始化为 vagrant 项目。

若是你使用版本控制,vagrantfile 可以使你很是方便的对项目进行版本控制。这样,你团对中的每一个人均可以在无需前期准备的状况下快速部署开发环境。

#3 - BOXES

从头开始建立虚拟机,是一个缓慢和繁琐的过程,Vagrant 利用镜像(image)克隆虚拟机。这些基本的镜像在 Vagrant 中被称为 boxes ,建立完 vagrantfile 后的第一步,就是指定你的 Vagrant 环境要使用的 box。

3.1. INSTALLING A BOX

若是你成功执行过下面命令(上面的UP AND RUNNING章节有提到)

$ vagrant init hashicorp/precise64
$ vagrant up

那么你就已经安装了一个 box,而且你不须要再次执行下面的命令。然而,这一小节仍然值一读,这能让你了解到更多关于 Vagrant box 方面的知识。

使用 vagrant box add 能够添加一个 box 到 Vagrant,这将存储 box 在特定的名称下,以便于多个 Vagrant 环境重复使用。若是你没有添加过任何 box 到 Vagrant,你能够执行下面的命令:

$ vagrant box add hashicorp/precise64

上述命令将会从 https://atlas.hashicorp.com/boxes/search 下载一个名为 hashicorp/precise64 的 box 。固然,这是最简单的下载 box 的方式,你也能够从一个本地文件或自定义路径添加 box。

boxes 被全局的存储在当前用户名下,每一个项目都可以经过克隆 box 镜像的方式使用 box,而且不会修全局的 box。这意味着,若是你有两个项目同时使用了名为 hashicorp/precise64 的 box,咱们在其中一个 Vgrant 项目的虚拟机中添加文件,彻底不会影响到另外一个。

经过上面的命令,你可能已经注意到,box 的名字是有命名空间的。box 名称由两部分组成,分别是用户名和 box 名,二者之间由斜杠 '/' 分隔。在上面的案例中,用户名是`hashicorp`,box 名是'precise64'。你也能够经过URL或本地文件路径指定 box,可是,在这篇入门文章中咱们不会具体到这一部分。

3.2. USING A BOX

如今 box 已经被添加进 Vagrant 了,须要配置咱们的项目以使用它。打开 vagrantfile 并修改内容以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
end

上述代码,`hashicorp/precise64`必须与你上一步添加的 box 名称一致。Vagrant 将经过该配置肯定应该使用哪一个 box。若是指定 box 在以前没有被添加到 Vagrant,当 Vagrant 运行时 Vagrant 将自动联网下载并添加他们。

你还能够经过 `config.vm.box_version` 配置明确的指定一个 box 版本: 

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.box_version = "1.1.0"
end

你也能够经过`config.vm.box_url`配置直接指定 box 的 URL:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

在下一节,咱们会启动并运行 Vagrant ,同时还会对它进行一些基本的操做。

3.3. FINDING MORE BOXES

该文档的剩余部分,咱们只会用到 "hashicorp/precise64" 这个 box。可是在结束这个文档以后,你的第一个问题多是 "哪里能够找到更多的box?”

最好的查找 box 资源的地方是 https://atlas.hashicorp.com/boxes/search 。除了使用免费的 box,你也能够经过 hashicORP‘s 发布本身的 box。

#4 - UP AND SSH

是时候启动你的第一个 Vagrant 环境了,在命令行执行下述命令:

$ vagrant up

很快,这个命令将会执行完毕,执行完毕后,你便拥有了一个运行 ubuntu 的虚拟主机。如今,你可能不会看到任何东西,由于 Vagrant 运行的这个虚拟主机并不包含 UI,可是,你能够经过 SSH 登陆到该主机。

$ vagrant ssh

这将使你与虚拟机建立一个 SSH 连接,你能够在该虚拟机中执行任何你须要的操做。这看上去很是完美,可是请谨慎操做 `rm -rf /` 命令,由于 Vagrant 共享了一个 '/vagrant' 目录,其和你主机上的 Vagrantfile 文件所在位置是同一个目录。 rm -rf / 将会删除全部的文件。共享目录的概述咱们将在下一节仔细讲解。

如今,花一点时间思考一下刚才发生了什么事:只有一行的配置和一条在你命令行终端执行的命令,咱们便拥有了一个全功能的,SSH可访问的虚拟主机。

SSH 会话能够用 Ctrl + D 终止。

vagrant@precise64:~$ logout
Connection to 127.0.0.1 closed.

当执行完你须要的操做后,运行 `Vagrant destroy` 可终止虚拟机运行,并释放虚拟机所占用的资源。

#5 - SYNCED FOLDERS

这真是太酷了, 使用 Vagrant 建立一个虚拟主机是如此的简单。不过,没有多少人愿意经过 SSH 在命令行终端里编写代码。幸运的是,在 Vagrant 中你不须要这样,Vagrant 提供了共享目录同步机制,它会自动同步主机共享目录中的文件到虚拟机中。

默认状况下,Vagrant 会共享你的项目目录(Vagrantfile文件的所在目录)到虚拟机的 `/vagrant` 目录中。

须要注意的是,当你经过 `vagrant ssh` 连接到虚拟主机时,你是在 `/home/vagrant` 目录中,该目录和上面提到的  '/vagrant' 不是同一个位置。

若是登录过程当中显示了一些错误,你可能须要更新你的 box 或者从新选择一个 box,一些用户经过 vagrant-vbguest 来处理该问题,不过这不是 vagrant 核心团队官方支持的。

再次运行 `vagrant up`,并 SSH 登录你的主机能够看到:

$ vagrant up
...
$ vagrant ssh
...
vagrant@precise64:~$ ls /vagrant
Vagrantfile

不管你信或不信,这个你看到的在虚拟主机里的 Vagrantfile 文件,实际上就是你的真实主机上的 Vagrantfile 文件。继续并新建一个文件:

vagrant@precise64:~$ touch /vagrant/foo
vagrant@precise64:~$ exit
$ ls
foo Vagrantfile

如今 'foo' 文件已经在你的主机上了,如你所见,Vagrant 会确保共享目录同步。经过 SYNCED FOLDERS ,你能够继续在你的主机上使用你喜欢的编辑器进行开发工做,代码会自动同步到虚拟主机中执行。

#6 - PROVISIONING

如今,咱们有一个基于 Ubuntu 系统的虚拟机,还能够从咱们的主机编辑文件并同步到虚拟机。接下来,咱们建立一个 web 服务器发布这些文件。

若是咱们经过 SSH 登陆虚拟机并以本身的方式安装 web 服务器,那么每个使用一样 Vagrant 环境的同事就都要重复这一安装过程。Vagrant 集成了自动配置功能来处理这些事务。使用这个特性,当你执行`vagrant up`命令的时候 Vagrant 将会自动的安装软件。如此一来,即可以很方便的建立 Vagrant 环境的副本在开发团队之间共享开发环境。

6.1. installing apache

咱们将使用一个 shell 脚本为咱们的 Vagrant 项目安装一个 apache。在 vagrantfile 所在目录中建立一个脚本文件 bootstrap.sh ,内容以下:

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi

接着,咱们经过修改 vagrantfile 文件,配置 vagrant 在启动时运行该脚本,代码以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
end

这里的 `provision` 行是新增的,它告诉 vagrant 使用 `bootstrap.sh` 脚本配置虚拟主机,脚本位置是相对与当前项目根目录的(vagrantfile 所在位置)。

6.2. PROVISION!

当一切都配置稳当,咱们只需执行 `vagrant up` 便可经过 Vagran 自动化的配置虚拟主机。过程当中你将会看到 shell 脚本的执行结果在你的命令行终端。若是虚拟主机已经处于运行状态,执行 `vagrant reload --provision` 将会快速重启虚拟主机,跳过初始导入步骤。 provision 参数告诉 Vagrant 执行 provisioners,由于该步骤一般只会在第一次执行 `vagrant up` 时执行。

Vagrant 启动完成后,Web服务器将启动和运行。如今,你还不能从你本身的浏览器看到网站,但你可经过SSh从服务器加载一个文件以验证 web 服务已在正常运行:

$ vagrant ssh
...
vagrant@precise64:~$ wget -qO- 127.0.0.1

上述命令会正常工做,由于咱们已安装 apache 并设置 documentroot 指向 `/vagrant`目录(咱们在前面配置的共享目录),您能够经过建立更多的文件并从终端查看它们,下一步咱们将讨论网络选项,以便您可使用本身的浏览器访问来虚拟主机。

#7 - NETWORKING

如今咱们有一个Web服务器,当咱们修改咱们的主机文件时,他们会自动同步到虚拟主机。然而,仅仅从终端访问虚拟机的网页并不使人满意。在这一步中,咱们将使用 Vagrant 的网络功能实现从咱们的主机访问虚拟主机。

7.1. PORT FORWARDING

这将用到端口转发功能,端口转发是转发一个网络端口从一个网络节点到另外一个网络节点的行为,其使一个外部用户从外部通过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内部)上的一个端口。这容许你在你本身的机器上访问一个端口,但实际上全部的网络流量都将转发到一个虚拟机的特定端口上。

让咱们创建一个转发端口,以便咱们在主机上访问虚拟主机中的Apache。只须要简单的编辑一下 vagrantfile 文件便可,操做以下:

Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
config.vm.network :forwarded_port, guest: 80, host: 4567
end

运行 `vagrant reload` 或 `vagrant up`(取决于虚拟主机是否已运行),上面的配置将会开始生效。

一旦虚拟主机完成重启,咱们即可在浏览器中打开 `http://127.0.0.1:4567` 访问虚拟主机中的页面。

7.2. OTHER NETWORKING

Vagrant 也有其余形式的网络工做模式,容许你为虚拟机指定一个静态IP地址,或桥接虚拟机的到一个已存在的网络。若是您对其余选项感兴趣,请阅读相关文档。

#8 - SHARE

如今,咱们有一个正常运行的Web服务器,而且可以经过咱们的主机访问。咱们已具有一个至关功能的开发环境。可是,除了提供一个开发环境, Vagrant 也能够很容易地共享一个开发环境。

Vagrant 分享可以使你方便快捷的分享你的 Vagrant 开发环境给周围任何能与互联网链接的人。它会生成一个网址,该 URl 用来让全世界任何一个链接互联网的设备都可以访问获取到你的开发环境。

8.1. LOGIN TO HASHICORP'S ATLAS

在分享你的 Vagrant 环境以前,你将须要一个 hashicorp 账户。不要担忧,它是免费的。
一旦你建立完帐号,即可使用 `vagrant login` 命令登陆:

$ vagrant login
Username or Email: mitchellh
Password (will be hidden):
You are now logged in!

8.2. SHARE

一旦登陆成功,运行 `vagrant share` 命令:

$ vagrant share
...
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com
...

您的网址将是不一样的,因此不要尝试上面的网址。相反,复制 vagrant share 输出的 URL 在 Web 浏览器中访问,它应该载入咱们早前在 Apache 中设置好的页面。

若是您修改共享文件夹中的文件并刷新 URL,您将看到它的更新!URL是直接路由到你 Vagrant 环境的。

在你的终端按下 Ctrl + C 可结束共享会话。您能够再次刷新URL,以验证您的环境再也不共享。

Vagrant 共享比简单的 HTTP 共享更强大。更多信息,请查看完整的 vagrant 共享文档。

#9 - TEARDOWN

咱们已经拥有一个功能齐全的虚拟机,可用于基本的 Web 开发。如今,是时候来谈一谈如何使 vagrant 中止工做了,好比咱们要切换到另外一个其它类型的工做项目,也许是出去吃午餐,或者只是到了回家时间。咱们该如何关闭咱们的开发环境呢?

Vagrant 中,你能够经过 `suspend` 、 `halt` 或 `destroy` 来中止虚拟主机运行。这些选项各有利弊,你应该根据需求选择最适合你的方法。

9.1. Suspending

调用 `vagrant suspend` 命令将暂停虚拟主机,它会保存当前运行的机器状态而后中止 Vagrant。当你准备开始工做时,只需执行 `vagrant up`,它将从你离开的地方从新开始。这种方法的主要好处是,它是超级快的,中止和开始你的工做一般只需5至10秒。缺点是虚拟机仍然占用你的磁盘空间,而且须要更多的磁盘空间来存储磁盘上的虚拟机内存状态。

9.2. Halting

调用 `vagrant halt` 命令,vagrant 会优雅地关闭虚拟机操做系统并关闭虚拟机。当你准备开始工做时,只需执行 `vagrant up`。这种方法的好处是,它会干净地关闭您的机器,保存磁盘的内容,并容许它再次干净的启动。缺点是,它会须要一些额外的时间用来冷启动操做系统,而且虚拟机关闭期间仍然占用磁盘空间。

9.3. Destroying

调用 `vagrant destroy` 命令将从您的系统中删除虚拟机的全部痕迹。它会中止虚拟机,关闭电源,并删除全部的虚拟磁盘信息。再次,当你准备好开始工做时,只需执行 `vagrant up`。这样作的好处是,没有任何东西在你的机器上留下。由虚拟机消耗的磁盘空间和RAM被回收,而且主机保持清洁。缺点是,`vagrant up` 启动时间会花费一些额外的时间,由于它须要从新导入和初始化 provision 。

#10 - REBUILD

当你准备好回到你的项目继续工做,不管是明天,从如今开始的一个星期后,仍是从如今开始的一年后,从新运行以前保存起来的项目都很是容易:

$ vagrant up

就是这样!因为 Vagrant 环境已经经过 vagrantfile 配置文件保存起来,你或者你的同事只需在适当的时候执行 `vagrant up` 便可快速重塑你的工做环境。

截至目前,你已经完整的把 Vagrant 整个生命周期梳理一遍了。

#11 - PROVIDERS

在这篇文章中,你的项目是基于 VirtualBox 的,可是 Vagrant 还能够与各式各样的其余 providers 一块儿工做,如 VMware , AWS 等等。能够到官网文档中阅读每一个 provider 页面,了解如何设置它们的更多信息。

一旦你有一个 provider 安装完成,你不须要对你的 vagrantfile 进行任何修改,只需在执行 `vagrant up` 命令时带上相应的 provider 参数便可。

$ vagrant up --provider=vmware_fusion

准备移动到云了吗?把它带到AWS:

$ vagrant up --provider=aws

一旦你运行 vagrant up 时指定了 provider ,其余 Vagrant 命令均再也不须要明确指定 provider 信息。因此,当你准备 SSH 、destroy 或其余操做时,只要运行常规的 Vagrant 命令便可。如 `vagrant destroy`,无需带任何参数信息。

#12 - The end

本文地址:http://www.cnblogs.com/kelsen/p/6247005.html

参考资料:https://www.vagrantup.com/docs/getting-started/

如您有任何建议或疑问请在下面留言交流。

相关文章
相关标签/搜索