创建自己的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机器同属于一个局域网,相互可连通。