windows 环境下的 vagrant 多节点集群环境搭建开发

第一部分:使用Vagrant快速创建虚拟机


一. 快速入门

1. 安装VirtualBox
2. 安装Vagrant
3. 创建虚拟机
vagrant box add node1  E:\vagrant-box\vagrant-centos-7.2.box
vagrant init node1
vagrant up --provider virtualbox
vagrant ssh
  • vagrant box add: 下载创建虚拟机所依赖的box
  • vagrant init: 生成创建虚拟机的所依赖的Vagrantfile
  • vagrant up: 创建虚拟机
  • vagrant ssh: SSH登陆虚拟机

不妨查看一下Vagrant自动生成的Vagrantfile, 我删除了所有注释:

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

Vagrantfile的内容非常简单,仅定义虚拟机所依赖的Boxubuntu/trusty64Box相当于虚拟机所依赖的镜像文件。因此,这里创建的虚拟机是ubuntu trusty(14.04)。如果你需要创建其他Linux发行版例如Debian或者CentOS,可以在这里搜索对应的Box.

Vagrant虚拟机的默认配置:

  • 用户/密码: vagrant/vagrant
  • 共享目录: 主机上的vagrant-ubuntu目录与虚拟机内的/vagrant目录内容实时同步
  • 内存:512MB
  • CPU: 1

默认配置并不一定满足开发需求,下一小节将介绍如何进行自定义配置。

二. 自定义配置

1. 修改Vagrantfile
vim Vagrantfile

可以通过注释理解每个自定义配置的含义。

Vagrant.configure(2) do |config|

  # 设置虚拟机的Box
  config.vm.box = "ubuntu/trusty64"
  
  # 设置虚拟机的主机名
  config.vm.hostname="ubuntu"
  
  # 设置虚拟机的IP
  config.vm.network "private_network", ip: "192.168.0.2"
  
  # 设置主机与虚拟机的共享目录
  config.vm.synced_folder "~/Desktop/share", "/home/vagrant/share"

  # VirtaulBox相关配置
  config.vm.provider "virtualbox" do |v|

      # 设置虚拟机的名称
      v.name = "ubuntu"

      # 设置虚拟机的内存大小
      v.memory = 2048

      # 设置虚拟机的CPU个数
      v.cpus = 1
  end
  
  # 使用shell脚本进行软件安装和配置
  config.vm.provision "shell", inline: <<-SHELL

     # 安装Docker 1.11.0
     apt-get update
     apt-get install apt-transport-https ca-certificates
     apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
     echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list
     apt-get update;
     apt-get install -y -q docker-engine=1.11.0-0~trusty
     usermod -aG docker vagrant

  SHELL

end
2. 在桌面上创建share目录

主机上的share目录将与虚拟机内的/home/vagrant/share目录内容实时同步

mkdir ~/Desktop/share
3. 创建虚拟机
vagrant destroy
vagrant up --provider virtualbox
4. SSH免密码登陆

使用vagrant ssh命令登陆虚拟机必须切换到Vagrantfile所在的目录,而直接使用虚拟机IP登陆虚拟机则更为方便:

ssh vagrant@192.168.0.2

此时SSH登陆需要输入虚拟机vagrant用户的密码,即vagrant

将主机的公钥复制到虚拟机的authorized_keys文件中即可实现SSH无密码登陆:

cat $HOME/.ssh/id_rsa.pub | ssh vagrant@127.0.0.1 -p 2222 'cat >> $HOME/.ssh/authorized_keys'

其中,2222是主机SSH登陆虚拟机的转发端口,可以通过以下命令查看:

vagrant ssh-config | grep Port
  Port 2222

此时SSH登陆虚拟机则不再需要输入密码。

5. 关于Provision

Vagrant中有下面一段内容:

# 使用shell脚本进行软件安装和配置
  config.vm.provision "shell", inline: <<-SHELL

     # 安装Docker 1.11.0
     apt-get update
     apt-get install apt-transport-https ca-certificates
     apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
     echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list
     apt-get update;
     apt-get install -y -q docker-engine=1.11.0-0~trusty
     usermod -aG docker vagrant

  SHELL

其实就是嵌入了一段Shell脚本进行软件的安装和配置,这里我安装了Docker,当然也可以安装其他所需要的软件。修改此段内容之后,重新创建虚拟机需要使用”–provision”选项。

vagrant halt
vagrant up --provider virtualbox --provision

其实,Vagrant支持创建Docker Provision,可以用于创建Docker主机,功能很多,但是用起来不如使用Shell脚本灵活。

三. Vagrant与Docker比较

VagrantDocker都可以用于快速创建开发环境,但是,Vagrant是用于创建虚拟机的,而Docker是用于创建容器的,所以两者的功能并不相同。实际工作中,我两个都用,Vagrant仅用于创建虚拟机作为容器运行环境,而Docker用于开发和运行实际应用。这样实现了开发环境两层隔离,MacBook不需要安装多余的软件,Vagrant所创建的虚拟机也仅需要安装Docker等少数软件,这样更加方便和安全。

Vagrant是基于Vagrantfile创建虚拟机,而Docker是基于Dockerfile创建容器镜像。两者都是将应用的运行环境代码化,所以非常灵活,易于重复,也可以作版本控制。但是,Vagrantfile的语法其实非常简陋,远没有Dockerfile灵活。因此,Vagrant仅适合于创建开发环境,或者作为容器运行的环境,并不适合打包应用。

Vagrant的功能与Docker Machine功能一致,都是用于创建虚拟机。但是,Docker Machine是专用于创建Docker主机的,而Vagrant可以用于创建不同的开发环境。理论上Docker用户使用Docker Machine会更方便,但是我并没有选择Docker Machine,因为感觉并没有实际需求。Docker Machine所创建的本地虚拟机默认基于Docker专用的Linux发行版boot2docker,云端虚拟机默认基于ubuntu,对其他Linux发行版的支持还处于实验阶段。而Vagrant稳定支持更多Linux发行版,所以可以满足更多需求。Vagrant可以通过Vagrantfile进行自定义配置,而Docker Machine并没有对应功能,因此Vagrant用于创建虚拟机更加灵活。

第二部分:使用Vagrant创建多节点虚拟机集群

一. 集群创建

1. 安装VirtualBox
2. 安装Vagrant
3. 下载Box
vagrant box add ubuntu/trusty64

Box相当于虚拟机所依赖的镜像文件。

4. 编辑Vagrantfile
mkdir vagrant-cluster
cd vagrant-cluster
vim Vagrantfile

Vagrantfile如下,可以通过注释理解每个自定义配置的含义:

Vagrant.configure("2") do |config|

	(1..3).each do |i|

		config.vm.define "node#{i}" do |node|

		# 设置虚拟机的Box
		node.vm.box = "ubuntu/trusty64"

		# 设置虚拟机的主机名
		node.vm.hostname="node#{i}"

		# 设置虚拟机的IP
		node.vm.network "private_network", ip: "192.168.59.#{i}"

		# 设置主机与虚拟机的共享目录
		node.vm.synced_folder "~/Desktop/share", "/home/vagrant/share"

		# VirtaulBox相关配置
		node.vm.provider "virtualbox" do |v|

			# 设置虚拟机的名称
			v.name = "node#{i}"

			# 设置虚拟机的内存大小  
			v.memory = 2048

			# 设置虚拟机的CPU个数
			v.cpus = 1
		end
  
		# 使用shell脚本进行软件安装和配置
		node.vm.provision "shell", inline: <<-SHELL

			# 安装docker 1.11.0
			wget -qO- https://get.docker.com/ | sed 's/docker-engine/docker-engine=1.11.0-0~trusty/' | sh
			usermod -aG docker vagrant
			
		SHELL

		end
	end
end

与创建单个虚拟机相比,创建多个虚拟机时多了一层循环,而变量i可以用于设置节点的名称与IP,使用#{i}取值:

(1..3).each do |i|

end

可知,一共创建了3个虚拟机。

5. 在桌面上创建share目录

桌面上的share目录将与虚拟机内的/home/vagrant/share目录内容实时同步

mkdir ~/Desktop/share
6. 创建虚拟机
vagrant up

创建3个虚拟机大概需要15分钟,当然这和机器性能还有网速相关。安装Docker可能会比较慢,不需要的话删除下面几行就可以了:

# 使用shell脚本进行软件安装和配置
node.vm.provision "shell", inline: <<-SHELL

	# 安装docker 1.11.0
	wget -qO- https://get.docker.com/ | sed 's/docker-engine/docker-engine=1.11.0-0~trusty/' | sh
	usermod -aG docker vagrant

SHELL

下面是Vagrant虚拟机的配置,可以根据需要进行更改:

  • 用户/密码: vagrant/vagrant
  • 共享目录: 桌面上的share目录将与虚拟机内的/home/vagrant/share目录内容实时同步
  • 内存:2GB
  • CPU: 1

二. 集群管理

1. 常用命令

下面是一些常用的Vagrant管理命令,操作特定虚拟机时仅需指定虚拟机的名称。

  • vagrant ssh: SSH登陆虚拟机
  • vagrant halt: 关闭虚拟机
  • vagrant destroy: 删除虚拟机
  • vagrant ssh-config 查看虚拟机SSH配置

启动单个虚拟机:

vagrant up node1

启动多个虚拟机:

vagrant up node1 node3

启动所有虚拟机:

vagrant up
2. SSH免密码登陆

使用vagrant ssh命令登陆虚拟机必须切换到Vagrantfile所在的目录,而直接使用虚拟机IP登陆虚拟机则更为方便:

ssh vagrant@192.168.59.2

此时SSH登陆需要输入虚拟机vagrant用户的密码,即vagrant

将主机的公钥复制到虚拟机的authorized_keys文件中即可实现SSH免密码登陆:

cat $HOME/.ssh/id_rsa.pub | ssh vagrant@192.168.59.2 'cat >> $HOME/.ssh/authorized_keys'
3. 重新安装软件

Vagrant中有下面一段内容:

# 使用shell脚本进行软件安装和配置
node.vm.provision "shell", inline: <<-SHELL

	# 安装docker 1.11.0
	wget -qO- https://get.docker.com/ | sed 's/docker-engine/docker-engine=1.11.0-0~trusty/' | sh
	usermod -aG docker vagrant
SHELL

其实就是嵌入了一段Shell脚本进行软件的安装和配置,这里我安装了Docker,当然也可以安装其他所需要的软件。修改此段内容之后,重新创建虚拟机需要使用”–provision”选项。

vagrant halt
vagrant up --provision
4. 共享目录挂载出错

VirtualBox设置共享目录时需要在虚拟机中安装VirtualBox Guest Additions,这个Vagrant会自动安装。但是,VirtualBox Guest Additions是内核模块,当虚拟机的内核升级之后,VirtualBox Guest Additions会失效,导致共享目录挂载失败,出错信息如下:

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
/sbin/mount.vboxsf: mounting failed with the error: No such device

安装Vagrant插件vagrant-vbguest可以解决这个问题,因为该插件会在虚拟机内核升级之后重新安装VirtualBox Guest Additions。

vagrant plugin install vagrant-vbguest


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值