Vagrant入门
简单地说,Vagrant让我们可以通过代码的方式快速地、可重复地创建针对不同虚拟环境的虚拟机,包括Virtualbox、AWS、Docker等。它使得我们可以一次性地、自动创建多个环境相同的虚拟机,对于软件开发和测试尤其有用。本文我们将以Virtualbox为例,看看Vagrant的基本使用。
这是一个关于Vagrant的学习系列,包含如下文章:
(一)快速入门
首先需要创建一个目录用于存放Vagrantfile文件以及Vagrant在工作中的数据:
mkdir my-vagrant-project
cd my-vagrant-project
然后初始化Vagrant工程:
vagrant init ubuntu/trusty64
该命令会在当前目录下创建Vagrantfile,并且指定所使用的box为ubuntu/trusty64,该box由Hashicorp官网提供。此时,Vagrant发现box的名字的格式为“用户名/box名”,则会使用“https://atlas.hashicorp.com/用户名/box名”来下载该box。对于非官网提供的box,可以通过以下命令创建:
vagrant init my-box https://boxes.company.com/my.box
其中,my-box为该box的名字,后面的URL为该box的下载地址。接下来就可以启动虚拟机了:
vagrant up
此时Vagrant会先从Hashicorp下载ubuntu/trusty64这个box(如果先前下载过了则跳过),然后启动虚拟机。在默认情况下,Virtualbox将作为provider,当然你也可以使用其他provider,比如以下命令将启动一个hyperv虚拟机:
vagrant up --provider hyperv
登录到虚拟机:
vagrant ssh
此时vagrant将使用默认的用户vagrant以及预设的SSH公钥密钥键值对直接登录虚拟机。
关闭虚拟机:
vagrant halt
删除虚拟机:
vagrant destroy
请注意,vagrant destroy只会删除虚拟机本身,也即你在Virtualbox将看不到该虚拟机,但是不会删除该虚拟机所使用的box。
Vagrant还会在Vagrantfile所在同级目录下创建一个.vagrant隐藏文件夹,该文件夹包含了在本地运行虚拟机的一些信息。如果使用了代码库管理(比如Git),这个.vagrant文件夹应该被ignore掉。
(二)添加和查看所下载的box
Vagrant会将所下载的box保存到~/.vagrant.d/boxes目录下,除了在执行“vagrant up”时Vagrant会下载box外,你也可以单独下载box到本地:
vagrant box add ubuntu/trusty64
这将从Hashicorp官网上下载ubuntu/trusty64这个box,你也可以指定一个另外的URL:
vagrant box add --name mybox http://someurl.com/ubuntu.box
这里的mybox是一个逻辑名字,你可以用该名字来设置Vangrantfile的“config.vm.box
”。
你可以在任何时候向Vagrant中添加新的box以备后用,在执行vagrant up时,Vagrant首先检查本地是有存在所需要的box,如果有则直接使用,如果没有则下载。
列出本地所有的box:
vagrant box list
删除某个box:
vagrant box remove box-name
(三)端口转发(Port Forwarding)
在默认情况下,Vagrant所创建的Virtualbox虚拟机使用的是NAT网络类型,即外界是不能直接访问你的虚拟机的,就连Host机器也访问不了。此时,如果你在虚拟机中启动的一个Tomcat来部署网站的测试环境,而又想外界能够访问的话,你需要使用端口转发:
Vagrant.configure("") do |config|
config.vm.network "forwarded_port", guest: 8080, host:
end
以上代码将Host机的8888端口转发到了虚拟机的8080端口,这样你便可以通过在Host机上访问http://localhost:8888来访问虚拟机的Tomcat了。对于Virtualbox来说,只有NAT类型的网络类型支持端口转发,这也是为什么Vagrant创建的Virtualbox虚拟机默认都有一个支持NAT的虚拟网卡,原因就是要能够支持Vagrant级别的端口转发。另外,Vagrant在第一次尝试连接虚拟机时使用的也是NAT。
(四)共享文件夹
在默认情况下,Vagrant所创建的虚拟机已经为我们创建了一个共享文件夹,在虚拟机上是/vagrant目录,在Host机上则为Vagrantfile所在目录,当然你也可以额外添加另外的共享文件夹:
Vagrant.configure("") do |config|
config.vm.synced_folder "src/", "/srv/website"
end
第一个参数为Host机器上的目录,第二个参数为虚拟机上的目录。
(五)Provision
简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。
直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:
Vagrant.configure("") do |config|
# ... other configuration config.vm.provision "shell", inline: "echo hello"
end
通过引用外部脚本文件的方式:
Vagrant.configure("") do |config|
config.vm.provision "shell", path: "script.sh"
end
在使用Ansible时,有两种方式:(1)在Host机器上安装Ansible,(2)采用Ansible Local的方式,即在虚拟机自身上安装Ansible。对于第(1)种方法,我们需要保证Host机器上已经安装了Ansible,然后进行配置:
Vagrant.configure("") do |config| #
# Run Ansible from the Vagrant Host
#
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end end
在使用第(2)种方法时,Vagrant会首先检查box中是否已经安装了Ansible,如果没有,则会自动安装到虚拟机上,然后再运行provision:
Vagrant.configure("") do |config|
# Run Ansible from the Vagrant VM
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook.yml"
end
end
当我们多次执行“vagrant up”启动虚拟机时,provison并不会每次都执行,只有在这三种情况下provision才会运行:
- 首次执行vagrant up
- 执行vagrant provision
- 执行vagrant reload --provision
当然,你也可以在Vagrantfile中配置成每次执行vagrant up时都运行provision:
Vagrant.configure("") do |config|
config.vm.provision "shell", inline: "echo hello",
run: "always"
end
(六)网络配置
在默认情况下,对于Virtualbox而言,Vagrant将使用Virtualbox的NAT网络方式,这种方式允许虚拟机访问外部网络,但是不允许外界访问虚拟机,就连Host机器也访问不了。另外,我们可以为虚拟机配置private network和public network。在配置private network时,相当于虚拟机和Host机共同组成了一个单独的局域网,外界无法访问该局域网,但是虚拟机可以访问外界,Host机和虚拟机之间也可以互访。请注意,这里说的外界是指原本和Host处于同一局域网的其他机器。
使用private network时,我们可以给虚拟机指定固定的私有IP:
Vagrant.configure("") do |config|
config.vm.network "private_network", ip: "192.168.50.4"
end
当然也可以使用DHCP的方式动态分配IP:
Vagrant.configure("") do |config|
config.vm.network "private_network", type: "dhcp"
end
对于Virtualbox而言,此时虚拟机其实有两张网卡在工作,一种是Vagrant默认创建的NAT网卡,另一种是Host only类型的网卡提供private network。
在使用public network时,虚拟机和Host在网络中具有同等的地位(共同使用Host机的物理网卡与外界通信),就相当于在Host所在网络中又多了一台计算机一样,此时虚拟机可以使用网络中的DHCP服务器获得与Host处于同一个网段的IP地址,以下配置默认采用DHCP方式配置public network:
Vagrant.configure("") do |config|
config.vm.network "public_network"
end
如果Host机器有多张网卡,此时运行vagrant up, Vagrant会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在Vagrantfile中进行配置:
config.vm.network "public_network", bridge: [
"en1: Wi-Fi (AirPort)",
]
这里的 Wi-Fi(AirPort)表示使用了Mac笔记本的Airport连接到Wi-Fi。
除了DHCP,也可以使用静态IP:
Vagrant.configure("") do |config|
config.vm.network "public_network", ip: "192.168.0.5"
end
(七)Provider特定配置
不同的Provider有不同的特性,也存在不同的配置方式。以Virtualbox为例,Vagrant默认会给虚拟机指定一个不具备可读性的名字,比如my-vagrant-project_default_1471685053487_94837,我们可以对此进行配置予以更改:
config.vm.provider "virtualbox" do |v|
v.name = "my_vm"
end
Provider的特定配置也可以覆盖Vagrant原来的配置:
Vagrant.configure("") do |config|
config.vm.box = "precise64" config.vm.provider "vmware_fusion" do |v, override|
override.vm.box = "precise64_fusion"
end
end
在下一篇中,我们将讲到如何创建自己的Vagrant box。
Vagrant入门的更多相关文章
- [转] Vagrant入门
[From] https://www.cnblogs.com/davenkin/p/vagrant-virtualbox.html 简单地说,Vagrant让我们可以通过代码的方式快速地.可重复地创建 ...
- vagrant 入门
0.说明 本门所有的操作都是基于mac.windows可做相应调整,大体流程是一样的. 1.什么是vagrant 通俗来讲vagrant是一个通过命令行,来管理虚拟机的工具,vagrant本身并没有提 ...
- Vagrant入门二(转)
原文:https://github.com/zhjchina/Go-best-practice/edit/master/ebook/zh/01.3.md 3 Vgrant使用入门 前面我们已经学会了如 ...
- Vagrant入门一(转)
原文: https://github.com/astaxie/Go-best-practice/blob/master/ebook/zh/01.2.md 1.2 Vagrant安装配置 实际上Vagr ...
- Vagrant 入门 - 配置
原文地址 现在我们已经有了一个运行 Ubuntu 的虚拟机,并且可以在宿主机上编辑文件并自动同步到虚拟机.现在让我们安装一个 web 服务器,通过服务器访问这些文件. 可以通过 SSH 进入并安装一个 ...
- Vagrant 入门 - box
原文地址 Vagrant 使用基础镜像来快速克隆虚拟机,而不是从头开始构建虚拟机.这些基础镜像在 Vagrant 中被称为"box",并且指定用于 Vagrant 环境的 box ...
- Vagrant入门[转]
Vagrant是一个简单易用的部署工具,用英文说应该是orchestration tool.它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境. Vagrant的基本工作原理大致如下: ...
- vagrant 入门3
创建第一个Vagrant虚拟环境以及工程(续集): (8) Provisioning: 通常情况下Box只做最基本的设置,而不是一次到位的设置好所有的环境.Vagrant通常使用chef或者Puppe ...
- vagrant 入门4
7. 打包 Packaging , 8080 end 2. 打包Project $ vagrant package --vagrantfile Vagrantfile.pkg 8. 打包完成后,在工程 ...
随机推荐
- mac远程桌面连接windows 8.1 update,提示: 远程桌面连接无法验证您希望连接的计算机的身份
在网上找到解决方案: SolutionEnable RDP security layer in Group Policy on the machine: Verify that the firewal ...
- 单元测试模拟框架:Nsubstitute
Nsubstitute是一个开源的框架,源码是C#实现的.你可以在这里获得它的源码:https://github.com/nsubstitute/NSubstitute NSubstitut ...
- MyBatis(增删改查)
1.工程中引入包: mybatis-3.2.7.mysql-connector-java-5.1.22-bin 2.添加配置文件: <?xml version="1.0" e ...
- Java多线程7:死锁
前言 死锁单独写一篇文章是因为这是一个很严重的.必须要引起重视的问题.这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只 ...
- Android编译过程中的碎碎念
刷机不是用rom包吗?怎么可以使用fastboot flashall -w将*.img文件刷入呢? 在Mac上面可以参考这篇文章进行刷机.概括来说解释从官方下载rom包,解压后运行./flash-al ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- JS实战 · 收缩菜单表单布局
获取节点的两种方式: 1.通过event对象的srcElement属性: 2.通过事件源对象用this传入. 代码如下: <html> <head> ...
- Maven日常 —— 你应该知道的一二三
以前在日常工作中,使用Maven只是机械的执行Maven clean.Maven install,对其中的原理与过程并无了解,近期阅读了<Maven实战>,对Maven有了更深入的理解. ...
- 王宝强新片P2P风波持续发酵,互金真的前途未卜?
王宝强离婚风波还未完全结束,一波未平一波又起,新片又引来话题爆点,其自导自演的电影<大闹天竺>陷P2P平台集资的新闻占据各大媒体头条. 该P2P平台为湖北武汉一家P2P互联网金融理财平台& ...
- VS中行号对齐的辅助线(虚线)去除
3张图 2 3