当我们用 Vagrant + VirtualBox 搭建好一个虚拟机,虚拟机肯定也安装、配置了很多东西,如果这时换设备了,或者开发的同事需要跟我的环境一样,或者新来的同事要搭建环境,不论哪一种情况都会耗费大量的时间。如果有一种办法把我本机的环境 “拷贝” 给需要的人,那岂不是不需要重新搭建,节省了大量时间。
下面介绍如何把虚拟机打包成一个box,让有需要的人都能使用一模一样的系统环境。导出上一篇介绍的PHP环境为例。
打包box
vagrant package 打包box详解
vagrant package -h
输入上面的命令,可以看到这个命令的各选项的意思:
- –base NAME 要打包为基盒的virtualbox中虚拟机的基名称(仅限virtualbox)
- –output NAME 输出名称要输出的文件的名称
- –include FILE,FILE… 包括文件,文件…以逗号分隔的附加文件与框一起打包
- –vagrantfile FILE 要用方框打包的vagrantfile文件vagrantfil
- -h, --help 打印此帮助
最后写好的命令大概长这样
vagrant package --base centos-lnmp_default_1562568215794_41270 --output lnmp.box
注意问题:
- centos-lnmp_default_1562568215794_41270:这个是虚拟机名称,不是vagrant box list出来的,vagrant box list出来的box源文件,跟现在要导出的一个样,并不是虚拟机名称;
- base、output前面是两个减号 --,并且减号中间无空格;
- 生成的box名称后面要加上.box后缀。
先说下我遇到的问题
获取虚拟机名称,网上的说法是使用命令
vboxmanage list vms
但是我一直提示这个
E:\vagrant\centos-lnmp>vboxmanage list vms
'vboxmanage' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
我想应该是没把VirtualBox的安装目录添加到环境变量path,然后我又到VirtualBox的安装目录执行还是这个鸟样,浪费我时间,不知哪里出问题了,找了半天也没找到。可能是安装时哪里搞错了,后来我找到另一个办法获取虚拟机名称。
点开这个工具
想导出哪个虚拟机,就右键点击,点开设置 -》储存 -》控制器 -》box-disk1.vmdk
这时不通过命令也能拿到虚拟机名称了。
导出box
最后的导出命令是这样的
vagrant package --base centos-lnmp_default_1562568215794_41270 --output lnmp.box
导出虚拟机名称为:centos-lnmp_default_1562568215794_41270
导出的box命名为:lnmp.box,这个指定一个名字比较好认,否则会自动生成一个默认的名称
此时不写路径则导出到当前目录
E:\>cd vagrant
E:\vagrant>cd centos-lnmp
E:\vagrant\centos-lnmp>vagrant package --base centos-lnmp_default_1562568215794_41270 --output lnmp.box
==> centos-lnmp_default_1562568215794_41270: Exporting VM...
==> centos-lnmp_default_1562568215794_41270: Compressing package to: E:/vagrant/centos-lnmp/lnmp.box
最后在当前目录centos-lnmp下生成了一个box文件
我这个包大概1.2G,导出时间大概3分钟左右,据说有一种轻量级的Linux发行版镜像只有一两百兆,用来搭环境最合适不过,这样制作的box也会非常小,感兴趣的可以自己去搞一搞。
这样就可以把这个包发给其他人,然后 vagrant add 添加这个包,初始化、启动,就可以得到一模一样的环境了。