开启Vagrant之旅
立即解锁
发布时间: 2025-08-20 02:35:30 阅读量: 1 订阅数: 3 

### 开启Vagrant之旅
在开发过程中,我们常常需要一个合适的环境来部署和测试应用程序。自己搭建环境是个不错的选择,但直接构建生产环境并非明智之举,我们可以先进行实践演练。同时,考虑到应用程序在生产环境中可能会运行在多台计算机上,我们也希望在实践环境中模拟这种情况。
#### 环境选择分析
我们有几种选择来搭建实践环境,但各有优劣:
- **使用闲置计算机**:家里地下室可能有闲置计算机,但它们可能已有特定用途,为了运行练习而重建它们会浪费时间。
- **使用工作服务器**:工作中可能有服务器资源,但将其用作测试床有风险,一个错误的网络配置可能导致无法访问服务器。
- **使用云服务器**:可以在云平台启动服务器实例,但使用云服务会产生费用,若忘记关闭实例,可能会造成经济损失。此外,使用云服务器需要良好的网络连接,且将公司代码和数据放在无法物理控制的服务器上可能存在安全担忧。
#### 选择Vagrant和VirtualBox
为了解决上述问题,我们可以使用VirtualBox和Vagrant这两个工具。Vagrant是一个用于构建和分发虚拟化开发环境的工具,它基于Oracle的VirtualBox管理虚拟机,让我们可以自由尝试各种操作系统,而不用担心损坏“真实”服务器。虽然设置这些工具和配置虚拟机需要一些时间,但它们能让我们搭建本地生产环境副本,用于开发系统配置和测试应用程序部署。随着应用程序的发展,我们还能在这个安全便捷的环境中尝试新系统。
#### 安装VirtualBox和Vagrant
- **安装VirtualBox**:
- VirtualBox是开源项目,遵循GPL 2许可证,我们可以在其官网([http://www.virtualbox.org/wiki/Downloads](http://www.virtualbox.org/wiki/Downloads))下载适用于Windows、Linux、Macintosh和Solaris的安装程序。
- 确保下载并安装4.1或更高版本,因为当前的Vagrant版本依赖较新的VirtualBox。
- 安装完成后,我们可以运行VirtualBox,它本身是一个非常有用的工具,在其界面中可以创建和配置虚拟机的内存、网络、串口和USB端口等。
- **安装Vagrant**:
- 可以在Vagrant的下载页面([http://downloads.vagrantup.com/](http://downloads.vagrantup.com/))下载最新版本(撰写本文时为1.0.2)进行安装,这是推荐的安装方式,也可以将其作为RubyGem安装。
- 安装完成后,运行`vagrant`命令(不带参数)来验证安装是否成功,会显示帮助信息。例如:
```bash
$ vagrant
Usage: vagrant [-v] [-h] command [<args>]
-v, --version
Print the version and exit.
-h, --help
Print this help.
Available subcommands:
box
destroy
halt
init
package
provision
reload
resume
ssh
ssh-config
status
suspend
up
«and more»
```
- 还可以使用`vagrant <command> -h`命令获取特定命令的详细信息,如`vagrant box -h`。
#### 使用Vagrant创建虚拟机
- **添加虚拟机定义(box)**:
- Vagrant内置支持创建Ubuntu 10.04虚拟机,我们可以使用`vagrant box add`命令添加Ubuntu 10.04 64位镜像,例如:
```bash
$ vagrant box add lucid64 http://files.vagrantup.com/lucid64.box
```
- 该命令会下载一个较大的文件(如Ubuntu 10.04 64位镜像为380MB),建议在快速网络环境下运行。
- “lucid64”这个名称来自Ubuntu的版本命名方案,“lucid”指Ubuntu 10.04的版本名称Lucid Lynx,“64”表示64位安装。我们也可以给box取其他名称,但使用与发行版相关的名称更便于管理。
- 除了Ubuntu,还有其他box可在非官方的Vagrant box索引([http://vagrantbox.es](http://vagrantbox.es))中找到。
- **创建虚拟机**:
- 进入之前创建的`deployingrails`目录,创建一个新目录`first_box`并进入:
```bash
$ cd ~/deployingrails/
$ mkdir first_box
$ cd first_box
```
- 运行`vagrant init`命令创建Vagrant配置文件`Vagrantfile`:
```bash
$ vagrant init
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.
```
- **设置虚拟机box**:
- 使用文本编辑器打开`Vagrantfile`,将其内容修改为以下Ruby代码,设置虚拟机的box为我们刚刚下载的`lucid64`:
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64"
end
```
- **启动虚拟机**:
- 保存`Vagrantfile`后,在`first_box`目录中运行`vagrant up`命令启动虚拟机:
```bash
$ vagrant up
[default] Importing base box 'lucid64'...
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- v-root: /vagrant
```
- 启动过程可能需要几分钟,但在中等性能的笔记本上大约只需一分钟。启动完成后,我们可以使用`vagrant ssh`命令连接到虚拟机:
```bash
$ vagrant ssh
Last login: Wed Aug 11 17:51:58 2010
vm $
```
#### 虚拟机操作提示
为了明确命令的运行位置,我们采用以下shell提示约定:
| 提示符号 | 含义 |
| ---- | ---- |
| `$` | 表示命令应在主机(如笔记本或台式机)上运行 |
| `vm $` | 表示命令应在虚拟机内运行 |
| `nagios $` 或 `app $` | 当有多个虚拟机同时运行时,使用相应的虚拟机名称作为提示 |
#### VirtualBox Guest Additions安装
在启动新的VirtualBox实例时,可能会收到“guest additions”与安装的VirtualBox版本不匹配的警告。Guest Additions可以让我们更方便地使用虚拟机,例如调整窗口大小。可以通过以下步骤安装最新版本:
- **在虚拟机内运行命令**:
```bash
vm $ sudo apt-get install dkms -y
vm $ sudo /dev/cdrom/VBoxLinuxAdditions-x86.run
```
- **如果是Mac OS X系统且找不到ISO镜像**:
```bash
$ cd ~/deployingrails/first_box/
$ cp /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso .
$ vagrant ssh
vm $ mkdir vbox
vm $ sudo mount -o loop /vagrant/VBoxGuestAdditions.iso vbox/
vm $ sudo vbox/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.1.12 Guest Additions for Linux..........
«and more output»
vm $ exit
$ vagrant reload
```
- **也可以从VirtualBox网站下载Guest Additions**:
```bash
vm $ mkdir vbox
vm $ wget --continue --output-document \
vbox/VBoxGuestAdditions_4.1.12.iso\
http://download.virtualbox.org/virtualbox/4.1.12/VBoxGuestAdditions_4.1.12.iso
vm $ sudo mount -o loop vbox/VBoxGuestAdditions_4.1.12.iso vbox/
«continue as above»
```
#### Vagrant实例管理
我们可以使用Vagrant管理虚拟机,例如暂停、恢复、停止或销毁虚拟机。由于创建新实例很简单,如果不使用实例,就没有必要保留。
我们可以不输入密码连接到虚拟机,这是因为`vagrant up`时Vagrant将主机的2222端口转发到了虚拟机的22端口。我们也可以绕过`vagrant ssh`的端口转发,使用`ssh`命令连接到虚拟机,添加`StrictHostKeyChecking`和`UserKnownHostsFile`选项,并在提示输入密码时输入`vagrant`:
```bash
$ ssh -p 2222 \
-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null vagrant@localhost
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
vagrant@localhost's password:
Last login: Thu Feb 2 00:01:58 2012 from 10.0.2.2
vm $
```
Vagrant包含一个“不太私密”的私钥,使用`-i`选项引用该私钥可以在不输入密码的情况下连接到虚拟机:
```bash
$ ssh -p 2222 \
-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-i ~/.vagrant.d/insecure_private_key vagrant@localhost
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
Last login: Thu Feb 2 00:03:34 2012 from 10.0.2.2
vm $
```
这个私钥被Vagrant网站称为“不安全”的密钥对,不建议用于其他用途,但在登录时可以避免输入密码。在后续的Capistrano练习中,我们会广泛使用这个转发端口和不安全的私钥。
现在我们已经学会了在本地创建虚拟机并使用`ssh`连接到它们,离部署应用程序又近了一步。接下来,我们将继续使用Vagrant,让新创建的虚拟机具备运行应用程序所需的所有工具。
#### 构建自定义基础box
我们之前使用了Ubuntu 10.04 64位的基础box创建了第一个虚拟机,但后续我们希望虚拟机上安装最新版本的Ruby。因此,我们将对这个基础box进行定制,安装Ruby 1.9.3,然后构建一个新的基础box,用于创建其他虚拟机。这样在创建新虚拟机时可以节省一些步骤,例如无需每次都下载和编译Ruby 1.9.3。
- **销毁旧虚拟机**:
```bash
$ cd ~/deployingrails/first_box
$ vagrant destroy --force
[default] Forcing shutdown of VM...
[default] Destroying VM and associated drives...
```
- **创建并启动新虚拟机**:
```bash
$ vagrant up
$ vagrant ssh
vm $
```
- **更新Ubuntu软件包并安装开发库**:
```bash
vm $ sudo apt-get update -y
vm $ sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev \
git-core curl libyaml-dev libcurl4-dev libsqlite3-dev apache2-dev -y
```
- **移除基础box自带的Ruby安装**:
```bash
vm $ sudo rm -rf /opt/vagrant_ruby
```
- **下载并编译Ruby 1.9.3**:
```bash
vm $ curl --remote-name http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz
vm $ tar zxf ruby-1.9.3-p194.tar.gz
vm $ cd ruby-1.9.3-p194/
vm $ ./configure
«lots of output»
vm $ make
«and more output»
vm $ sudo make install
«still more output»
```
- **验证Ruby安装**:
```bash
vm $ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
```
- **验证默认gems**:
```bash
vm $ gem list
*** LOCAL GEMS ***
bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.4)
```
- **打包虚拟机为新的基础box**:
```bash
vm $ exit
$ vagrant package
[vagrant] Attempting graceful shutdown of linux...
[vagrant] Cleaning previously set shared folders...
[vagrant] Creating temporary directory for export...
[vagrant] Exporting VM...
[default] Compressing package to: [some path]/package.box
```
- **添加新的基础box到列表**:
```bash
$ vagrant box add lucid64_with_ruby193 package.box
[vagrant] Downloading with Vagrant::Downloaders::File...
[vagrant] Copying box to temporary location...
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...
```
- **验证Vagrant是否识别新的基础box**:
```bash
$ vagrant box list
```
通过以上步骤,我们成功构建了一个自定义的基础box,后续可以使用这个box创建具备所需工具的虚拟机,为应用程序的部署和测试做好准备。
### 开启Vagrant之旅
#### 后续使用自定义基础box创建虚拟机
有了自定义的基础box `lucid64_with_ruby193` 后,创建新虚拟机就更加便捷了。以下是具体步骤:
1. **创建新目录并初始化**
```bash
$ cd ~/deployingrails/
$ mkdir new_box
$ cd new_box
$ vagrant init
```
2. **修改Vagrantfile**
使用文本编辑器打开 `Vagrantfile`,将其内容修改为:
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
end
```
3. **启动虚拟机**
```bash
$ vagrant up
```
由于使用的是自定义基础box,启动过程会更快,并且新虚拟机已经预装了Ruby 1.9.3等所需工具。启动完成后,使用 `vagrant ssh` 连接到虚拟机:
```bash
$ vagrant ssh
vm $
```
#### 多虚拟机环境搭建
在实际开发中,我们可能需要同时运行多个虚拟机来模拟复杂的生产环境。例如,一个应用服务器和一个数据库服务器。以下是搭建多虚拟机环境的步骤:
1. **修改Vagrantfile**
```ruby
Vagrant::Config.run do |config|
config.vm.define :app do |app_config|
app_config.vm.box = "lucid64_with_ruby193"
end
config.vm.define :db do |db_config|
db_config.vm.box = "lucid64_with_ruby193"
end
end
```
上述代码定义了两个虚拟机:`app` 和 `db`。
2. **启动多虚拟机**
```bash
$ vagrant up
```
启动完成后,可以分别使用以下命令连接到不同的虚拟机:
```bash
$ vagrant ssh app
app $
$ vagrant ssh db
db $
```
#### Vagrant网络配置
Vagrant提供了多种网络配置选项,以满足不同的开发需求。常见的网络配置类型如下:
| 网络类型 | 描述 |
| ---- | ---- |
| **端口转发** | 将主机的端口转发到虚拟机的端口,方便从主机访问虚拟机的服务。例如,将主机的8080端口转发到虚拟机的80端口。 |
| **私有网络** | 虚拟机可以通过私有IP地址与主机或其他虚拟机通信,外界无法直接访问。 |
| **公有网络** | 虚拟机可以像主机一样连接到外部网络,获取公网IP地址。 |
以下是不同网络配置的示例:
- **端口转发**
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
config.vm.forward_port 8080, 80
end
```
上述配置将主机的8080端口转发到虚拟机的80端口。
- **私有网络**
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
config.vm.network :private_network, ip: "192.168.33.10"
end
```
上述配置为虚拟机分配了一个私有IP地址 `192.168.33.10`。
- **公有网络**
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
config.vm.network :public_network
end
```
上述配置让虚拟机连接到公有网络。
#### Vagrant共享文件夹
Vagrant允许在主机和虚拟机之间共享文件夹,方便在两者之间传输文件。默认情况下,Vagrant会将主机上的项目目录共享到虚拟机的 `/vagrant` 目录。例如,在主机上的 `~/deployingrails/new_box` 目录会共享到虚拟机的 `/vagrant` 目录。
我们也可以自定义共享文件夹的配置:
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
config.vm.synced_folder "/path/on/host", "/path/on/guest"
end
```
上述配置将主机上的 `/path/on/host` 目录共享到虚拟机的 `/path/on/guest` 目录。
#### Vagrant自动化配置脚本
为了进一步提高开发效率,我们可以使用自动化配置脚本来自动安装和配置虚拟机所需的软件和服务。例如,使用Shell脚本或Ansible等工具。
以下是一个使用Shell脚本进行自动化配置的示例:
1. **创建Shell脚本**
在主机上创建一个名为 `setup.sh` 的脚本:
```bash
#!/bin/bash
sudo apt-get update -y
sudo apt-get install nginx -y
```
上述脚本用于更新Ubuntu软件包并安装Nginx。
2. **在Vagrantfile中配置脚本**
```ruby
Vagrant::Config.run do |config|
config.vm.box = "lucid64_with_ruby193"
config.vm.provision :shell, path: "setup.sh"
end
```
上述配置会在虚拟机启动时自动执行 `setup.sh` 脚本。
#### 总结
通过使用Vagrant和VirtualBox,我们可以轻松搭建本地开发环境,模拟复杂的生产环境。从安装工具、创建虚拟机、构建自定义基础box,到多虚拟机环境搭建、网络配置、共享文件夹设置和自动化配置脚本的使用,Vagrant为我们提供了强大而灵活的功能。
在实际开发中,我们可以根据项目需求选择合适的配置选项,提高开发效率,减少环境搭建和配置的时间成本。同时,使用Vagrant可以确保团队成员使用相同的开发环境,避免因环境差异导致的问题。
希望本文能帮助你更好地理解和使用Vagrant,让你的开发工作更加高效和便捷。
0
0
复制全文


