Vagrant进阶篇

创建自己的Vagrant box

在前一篇中介绍了一些关于Vagrant的一些常用命令和一些基本的操作,当然如果每次都从一个基础的centos box开始创建一个虚拟机,然后还要通过vagrantfile一步步来注入和安装一些软件和环境,最终才得到我们想要的虚拟机。每次新起一个虚拟机的时候都要这样操作一波的话,太浪费时间了。身为程序员,应该要拒绝重复简单的操作。那么下面说说解决方案。

第一个解决方案就是从上一篇说到的提到过的vagrant官网提供的box库中下载https://app.vagrantup.com/boxes/search,这个操作跟dockerfile的操作有些类似,打开这个url之后,找到你想要的box,然后点击进去会出现这个界面
这里写图片描述
这时你有很多个方式来下载这个box,最本质的使用方法是如果已经有vagrantfile的话,打开vagrantfile,把图中的配置复制进去,然后up一下就好了。

如果还没有init那么可以通过init这个box的名字来创建,例如下图的方式
这里写图片描述
当然上面这些办法都是要时间下载的,特别是国内的情况,下载的话肯定是特别慢。

那么还有第二种办法,到http://www.vagrantbox.es/中下载一个box到本地,然后通过vagrant box add命令添加到vagrant中,再通过init创建一个vagrantfile,然后up一下就好了。然而这种有的时候并不能总是刚好满足对虚拟机的要求,这时可以就要考虑制作自己的box。那么下面就以centos7为基础来创建新的box。

首先初始化Vagrantfile:

vagrant init centos

这里的centos是上一篇已经下载好了的box,如果没有下载好的box那么建议最好先下一个box,因为使用vagrant下载的话太慢了。下载box的地址上面已经给出,这里不重复。

编辑Vagrantfile,通过Shell安装docker,同时设置私有网络(由于默认的网络是Virtualbox的NAT,故Host机是不能访问到虚拟机的):

Vagrant.configure("2") do |config|
  config.vm.box = "centos"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision "shell", inline: <<-SHELL
    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install -y docker-ce
    sudo systemctl start docker
  SHELL
   config.vm.provider "virtualbox" do |v|
       v.name = "centos-dev"
    end
end

然后,启动虚拟机:

vagrant up

然后可以通过vagrant ssh进去看一下相关的网络配置和docker是否安装好了。然后接下来就可以基于这个虚拟机来创建一个新的box。一个有docker的centos的box。

先关闭虚拟机:

vagrant halt

然后通过vagrant package命令来创建新box,这里刚刚是给虚拟机指定了名字,所以可以用下面这种方式创建新的虚拟机:

vagrant package --output xxx.box --base my-virtualbox

Vagrant将创建名为package.box的新的box,此后我们便可以使用该package.box作为其他虚拟机的基础box了。另外,如果当前处于Vagrantfile文件所在目录,则可简化创建命令:

vagrant package

如果此时虚拟机正在运行,Vagrant将先关闭运行的虚拟机,然后创建box。另外,“vagrant package”也可以为任何Virtualbox的虚拟机创建box,而不一定非得是vagrant启动的虚拟机,只要“–base”参数指向Virtualbox的某个虚拟机名字即可。

创建多台虚拟机

上面说了如何创建一台个性化定制虚拟机的box,那么下面接着就来看一下如何通过vagrant来创建多台不同要求的虚拟机。
如果需要创建多台虚拟机,可以通过在vagrantfile中使用config.vm.define来定义多台机器,通过引用外部的shell脚本进行provision:

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

  config.vm.define "master" do |master|
      master.vm.network "private_network", ip: "192.168.31.2"
      master.vm.provision "shell", inline: "master_provision.sh"
      master.vm.provider "virtualbox" do |v|
        v.name = "master"
      end
  end

  config.vm.define "node1" do |node1|
      node1.vm.network "private_network", ip: "192.168.31.3"
      node1.vm.provision "shell", path: "node1_provision.sh"
      node1.vm.provider "virtualbox" do |v|
        v.name = "node1"
      end
  end

  config.vm.define "node2" do |node2|
      node2.vm.network "private_network", ip: "192.168.31.4"
      node2.vm.provision "shell", path: "node2_provision.sh"
      node2.vm.provider "virtualbox" do |v|
        v.name = "node2"
      end
  end
end

在每一个config.vm.define的配置内部,我们可以使用与其外部相同的配置项,内部配置会覆盖外部配置。这样,我们可以在外部配置中设置一些所有机器都共享的配置信息,然后在每个config.vm.define内部中针对性地配置某一台机器。比如在master_provision.sh文件中配置master需要的配置,然后在node1中配置node1_provision.sh。运行“vagrant up”,在Virtualbox中将出现三台虚拟机,他们与host机器同属于一个局域网,相互可连通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值