如何安装Vagrant和VirtualBox

107 阅读7分钟

Vagrant提供了易于配置、可复制和可移植的工作环境,由一个统一的工作流程控制,以帮助最大化你和你的团队的生产力和灵活性。如果你是一个开发人员,Vagrant将在一个一次性的、一致的环境中隔离依赖关系及其配置,而不牺牲你习惯使用的任何工具(编辑器、浏览器、调试器等)。一旦你或其他人创建了一个单一的Vagrant文件,你只需要vagrant起来,一切都为你安装和配置好了,就可以工作了。要开始工作,请下载VagrantVirtualBox

快速入门

vagrant init hashicorp/precise32
vagrant up

工作中的Vagrant文件样本


创建一个文件,将其称为Vagrantfile

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

一旦你有了这个文件,运行这个命令

vagrant up

虚拟盒配置


Vagrant.configure(2) do |config|
	config.vm.box = "ubuntu/trusty32"

	# set hostname
	config.vm.hostname = "dev.google.com"

	# postup message
	config.vm.post_up_message = "Access at http://dev.google.com"

	# virtual box configuration
	config.vm.provider "virtualbox" do |v|
		# naming your VM
		v.name = "my-fantastic-project"
		# setting RAM to 1GB
		v.memory = 1024
		# set CPUs
		v.cpus = 2
	end
end

共享目录


config.vm.synced_folder "host/relative/path", "/guest/absolute/path"

Vagrant.configure(2) do |config|
	# note that you can have this config multiple times but
	# it should only be used for source code since there is
	# heavy performance penalty on heavy I/O such as database files

	# first path is the host's path, which can by absolute
	# or relative to project's root directory

	# second path is the guest path, and it must be absolute.
	# It will always be created if it does not exist.
	config.vm.synced_folder ".", "/vagrant"

	config.vm.synced_folder "./some/dir/one", "/one", create:true
	config.vm.synced_folder "./some/dir/two", "/two", create:true

	# note that you can also add type. NFS is the faster
	# bidirectional file syncing. In order for this to work,
	# the host machine must have `nfsd` installed. It comes
	# preinstalled on OSX and is a simple package install on Linux
	config.vm.synced_folder "." "/vagrant", type: "nfs"

	# owner/group
	config.vm.synced_folder "." "/vagrant", owner: "root", group: "root"
end

# To reconfigure the guest machine, vagrant reload must be run.
# This halts the machine and starts it up again with
# the new configuration.
# It skips the initial step to clone the box since it is
# already created.
vagrant reload

快速联网示例


Vagrant.configure(2) do |config|

	# expose guest port 80 to host 8080
	config.vm.network :forwarded_port, guest: 80, host: 8800
end

拆解


# suspends the state (uses host resources still)
vagrant suspend

# shut down
vagrant halt

# destroy all traces
vagrant destroy

编写供应的壳牌脚本


# note that paths are relative the the project root
config.vm.provision "shell", path: "provision.sh"

provision.sh

#! /usr/bin/env bash

# note that all these will be run as sudo
echo "Installing Apache"
apt-get update >/dev/null 2>&1
apt-get install -y apache2 >/dev/null 2>&1
rm -rf /var/www
ln -fs /vagrant /var/www

深入网络


请注意,只要客户机有空间容纳额外的网络接口,就有可能组成网络选项。比如说。

# forwarded ports
config.vm.network :forwarded_port, guest: 80, host: 8800
# host-only networking
config.vm.network "private_network", ip: "192.168.33.10"

另外,请注意,对于VirtualBox,Vagrant要求连接到虚拟机的第一个网络设备是一个NAT设备。因此,任何纯主机或桥接的网络将被添加为额外的网络设备,并以 "eth1"、"eth2 "等形式暴露给虚拟机。"eth0 "通常总是NAT设备。注意,不可能覆盖这个要求。

转发的端口

Vagrant.configure(2) do |config|
	config.vm.network :forwarded_port, guest: 80, host: 8800
	# or with auto-collision detection/correction
	# and limit auto-correct ports between 2200-2250
	config.vm.usable_port_range = (2200..2250)
	config.vm.network :forwarded_port, guest: 80, host: 8800, auto_correct: true
end
vagrant reload
vagrant ssh

使用转发端口,Vagrant会在主机上设置一个端口,转发到客户机上的一个端口,允许你在没有IP的情况下访问客户机上的服务。

使用这个的好处是,它的设置非常简单。你只需在Vagrant文件中告诉Vagrant要转发哪些端口。

但是,这种简单性是有代价的。首先,你必须明确你要转发的端口。对于基本的网络服务,这很容易。但是一旦你开始处理数据库等,它将很快变得乏味。此外,它将成为你自己的计算机之外的访问。

最后,对于VirtualBox,Vagrant不能转发到主机系统上小于1024的端口,因为操作系统不允许没有管理权限的进程这样做,比如Vagrant。所以,如果你想测试SSL,这不是一个使用端口转发的好方法。

默认情况下,转发的端口只对TCP连接起作用。如果你也需要转发UDP数据包,你必须用UDP端口转发配置一个额外的转发端口,即。config.vm.network :forwarded_port, guest: 80, host: 8800, protocol: "udp"

仅限主机的网络(私人网络)

使用专用网络,你可以做以下事情。

  • 避免单独输入每个转发端口的配置
  • 避免使用端口号,如8080用于知名服务
  • 在不同的项目中使用相同的端口号
  • 在多个客人之间进行通信
  • 为共享目录使用NFS
Vagrant.configure(2) do |config|
	# must enter static IP (any is fine)
	config.vm.network "private_network", ip: "192.168.33.10"
end
vagrant reload
vagrant ssh
ping 192.168.33.10
# inside guest vm, you can access host too (x.x.x.1)
ping 192.168.33.1

这就创建了一个对你的主机和该主机上的客人机来说是私有的网络。因为它是一个新的自定义网络,它有自己的IP地址空间,所以只使用主机网络的客人机可以获得自己的IP。

Vagrant通过为机器指定一个静态IP来支持纯主机的网络。Vagrant将处理创建纯主机网络和配置客机以获得指定的IP。

这创建了一个安全的网络,因为只有主机和客机可以相互通信。外部的计算机没有办法访问你可能正在运行的网络服务。

然而,这样做的一个好处是,多个虚拟机可以通过成为同一网络的一部分来相互通信。通过转发的端口,一个虚拟机不能与另一个虚拟机对话。

你可以将服务分离到多个虚拟机上,以更准确地模仿生产,如网络服务器和数据库服务器。

此外,虚拟机还可以与主机本身进行通信。

运行多个虚拟机


这就会出现两个虚拟机。注意,你必须在初始化这个新的Vagrant文件之前,先销毁这个项目中现有的虚拟机。

请注意,在Vagrant环境中引入多个机器的时候,vagrant命令的行为会有一些变化。大多数命令,如up destroyrelaod ,现在都需要一个参数,即要影响的机器的名称。例如,vagrant reload web 。如果你没有指定参数,Vagrant会假定你想对每台机器采取行动--在这种情况下,vagrant reload 将重新加载两个虚拟机。你还可以添加多个参数,甚至是正则表达式,即:vagrant reload node1 node2 node3vagrant reload /node\d/

在两台客机之间进行通信时,理想的网络是通过使用纯主机的网络

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

	config.vm.define "web" do |web|
		web.vm.forwarded_port 80, 8080
		web.vm.provision :shell, path: "provision.sh"
		web.vm.provision :shell, inline: "apt-get -y install mysql-client"
		web.vm.network "private_network", "192.168.33.10"
	end

	config.vm.define "db" do |db|
		db.vm.provision :shell, path: "db_provision.sh"
		db.vm.network "private_network", "192.168.33.11"
	end
end
# db_provision.sh

# this makes it so that when installing MySQL server, it
# does not ask us questions for a root password and all that
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y mysql-server
# replace the bind address from loopback to 0.0.0.0 which
# means all interfaces. This is necessary so that remote
# machiens can connect to the server.
sed -i -e 's/127.0.0.1/0.0.0.0/' /etc/mysql/my.cnf
restart mysql
mysql -u root mysql <<< "GRANT ALL ON*.* TO 'root'@'%'; FLUSH PRIVILEGES;"

记住要运行vagrant destroy ,从一个干净的地方开始。现在,运行vagrant ssh web

包装盒子


vagrant package

创建新盒子的最简单方法是使用现有的Vagrant环境作为起点。

这种方法用于创建新的盒子,这些盒子比之前的基础有更多的预装软件。因此,如果你想支持一个新的操作系统,或一个新的裸机镜像,你会想阅读下一节,而不是从头开始创建新盒子。

从现有的Vagrant环境中创建新的盒子,对于在基础镜像中预装和配置软件是很有用的,这样vagrant的启动就会更快。

这是大型企业的常见做法,在这些企业中,配置运行可能需要一个小时或更长时间。这样的配置时间大大降低了Vagrant环境的可支配性,损害了该工具的关键生产力提升。要从现有的环境中建立一个盒子,你首先需要一个现有的环境,所以vagrant起来吧这样做之后,在机器上安装任何你想要的软件。