这是一个关于Vagrant的学习系列,包含如下文章:

  1. Vagrant入门
  2. 创建自己的Vagrant box
  3. 用Vagrant搭建Jenkins构建环境
  4. 用Vagrant和Ansible搭建持续交付平台

上一篇中,我们讲到了Vagrant的基本使用,在本文中我们将尝试创建自己的Vagrant box。

本文源代码:https://github.com/davenkin/vagrant/tree/master/ubuntu1604-jdk1.8-tomcat8

Vagrant box只是提供了一个虚拟机的基线,比如对于Harshicorp官网提供的unbuntu/trusty64这个box,相当于只是一个Ubuntu的ISO安装文件。一般来讲,在安装了操作系统之后,你都需要安装一些额外的软件以供项目所用,比如,要部署一个网站,你可能需要安装Tomcat以及MySQL等等。此时,我们可以通过在Vagrantfile中配置Provision来帮助我们自动完成这些软件安装任务。但是当需要安装的软件越来越多以及需要启动的虚拟机数量越来越多,执行Provison也会变得越来越慢,此时我们便可以将一些公共的软件预先打包到box中,即创建自己的box。然后将这样的box在团队或者公司范围内发布以供后用。当然,除了加快虚拟机启动过程,创建自己的box还使得我们预先对所有虚拟机进行相同的基本配置,比如安装公司的安全证书,比如创建属于自己的操作系统用户(默认用户名为vagrant)以及配置相应的公钥等。

对于Vagrant box来说,我们需要向box注入以下功能:

  1. Vagrant box中需要提供SSH功能,以便能够使用vagrant ssh命令登录虚拟机
  2. 需要提供一个默认的用户以及相应的登录方式(比如免密钥登录和密码登录),对于大多数Vagrant box来说,默认都提供了用户名为vagrant的SSH密码登录功能。
  3. 对于特定的Provider,还需要安装某些特定的软件,比如对于Virtualbox来说,为了能使共享文件夹功能能够正常工作,box中还需要安装VirtualBox Guest Additions,另外第一块网卡必须为NAT类型,因为Vagrant需要使用NAT与虚拟机完成首次通信。

当然,我们并不需要完全从头到尾创建一个box,而是可以在一些公共的box的基础之上通过添加额外的功能来创建自己的box,因为这些公共box已经包含了上述功能。本文便将通过使用ubuntu/xenial64作为基础来创建新的box。

我们将使用Shell作为Provision方式,向新的box中添加以下功能:

  1. 安装openjdk 1.8
  2. 安装Tomcat

首先初始化Vagrantfile:

vagrant init -m ubuntu/xenial64

值得一提的是,ubuntu/xenial64默认使用的SSH登录用户名为ubuntu,而不是先前的vagrant。

编辑Vagrantfile,通过Shell安装openjdk1.8和Tomcat 8,同时设置端口转发以便Host机器能够访问Tomcat主页(由于默认的网络是Virtualbox的NAT,故Host机是不能访问到虚拟机的):

$script = <<SCRIPT
sudo apt-get update
sudo apt-get -y install openjdk--jdk
sudo apt-get -y install tomcat8
SCRIPT Vagrant.configure("") do |config|
config.vm.provision "shell", inline: $script
config.vm.box = "ubuntu/xenial64"
config.vm.network "forwarded_port", guest: , host: 8080

config.vm.provider "virtualbox" do |v|
       v.name = "my-virtualbox"
    end

end

启动虚拟机:

vagrant up

此时在Host机上访问http://localhost:8080,你会看到“It Works!”,表示Tomcat安装及运行成功。

好了,前面讲的都只是如何创建虚拟机,有了这些准备我们才能够基于新建的虚拟机创建box。

先关闭虚拟机:

vagrant halt

由于在Vagrantfile中,我们为虚拟机指定了名字“my-vertualbox”,在创建box时我们可以直接通过该名字指向新建的虚拟机:

vagrant package --base my-virtualbox

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

vagrant package

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

在下一篇中,我们将讲到用Vagrant搭建Jenkins构建环境

创建自己的Vagrant box的更多相关文章

  1. 如何拥有一个自己的Vagrant box

    这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...

  2. laravel homestead vagrant box安装使用,问题,及相关命令

    Vagrant is a tool that manages oracle virtual boxes 1.本地下载https://atlas.hashicorp.com/laravel/boxes/ ...

  3. Vagrant (3) —— 复制/备份Vagrant Box

    Vagrant (3) -- 复制/备份Vagrant Box 摘要 介绍复制/备份Vagrant Box基本方法 版本 Vagrant版本: 1.8.1 内容 复制vagrant box并压缩 关闭 ...

  4. 用CentOS 7自制Vagrant Box文件

      写在前面 利用vagrant保持开发生产环境一致是一个很好的方法,不过vagrant官网上的box文件下载是真的很慢,因此,这里教大家如何自制box文件. 这篇文章你会接触到: vagrant使用 ...

  5. 效率工具 | 快速创建虚拟机,Vagrant真香!

    Vagrant 是一个基于Ruby的工具,主要用于创建和部署虚拟化开发环境.它以来于Oracle的开源VirtualBox虚拟化系统,通过使用 Chef创建自动化虚拟环境. Vagrant 主要的功能 ...

  6. vagrant box保存路径修改

    add box的时候默认保存在C盘用户文件夹 C:\Users\xxx.vagrant.d,通过设置VAGRANT_HOME环境变量改变默认位置 WIN setx VAGRANT_HOME “X:/y ...

  7. vagrant box各种命令汇总

    最近在研究laravel,中间用到了vagrant 虚拟机管理工具,学习一下他的命令 vagrant box命令 用于管理boxes的命令,比如添加.删除等等. 此命令的功能主要通过以下子命令完成: ...

  8. 通过Vagrant搭建PHP环境(一) Vagrant box添加配置

    系统Windows10 Vagrant 1.8.1 VirtualBox 5.0.20 vagrant box下载地址:http://cloud.centos.org/centos/7/vagrant ...

  9. Vagrant box ubuntu/xenial64 添加vagrant用户解决没有登录密码的问题

    参考了Vagrant box ubuntu/xenial64 の ubuntuユーザ の passwordについて 1. 可以通过 Git Bash 使用  vagrant ssh 登录到Ubuntu ...

随机推荐

  1. JQ下的常见插件

    插件的概述:插件是以 jQuery 的核心代码为基础,编写出复合一定规范的应用程序.也就是说,插件也是 jQuery 代码,通过 js 文件引入的方式植入即可. 插件的种类很多,达上千种,主要大致可以 ...

  2. Unity学习疑问记录之向量基础

    这里写得非常好了: http://blog.gamerisker.com/archives/347.html

  3. 给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

    在“如何用MediaCapture解决二维码扫描问题”这篇文章中,我们通过“成像”.“截图”与“识别”三个步骤介绍了使用MediaCapture扫码的主要过程及注意事项.本文主要针对“识别”的过程,对 ...

  4. .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

    开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...

  5. iOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  6. 深入浅出Alljoyn——实例分析之远程调用(Method)篇

    深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...

  7. Java使用RSA加密解密及签名校验

    该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...

  9. linux java 版本

    之前linux已经安装了1.6的版本, 我想要升级,于是安装了1.7, /etc/profile 的最后几行是这么写的: JAVA_HOME=/usr/java/jdk1.7.0_79JRE_HOME ...

  10. rem单位和em单位的使用

    今天弄了一点响应式的东西,本以为很快就可以弄好,结果还是绕晕了头,所以还是写下来方便下次看吧! 一开始我打算用百分比%来做响应式布局,后来算的很懵圈,就果断放弃了,哈哈是不是很明智. 接下来就是rem ...