概述
Vagrant使用 Beta
Destroy
销毁将会使客户机器从宿主机的磁盘上全部抹掉,一旦客户机被销毁将会回到最原始的状态,就像你从没有启动过一样,要注意的是使用这个命令会丢失你所有的文件和数据,不过好处就是客户机被销毁了,宿主机就会恢复到原先的状态,不会占用多余的磁盘空间,不会有和客户机相关的进程来消耗我们的CPU和内存资源,尤其是像我这种电脑配置不是很高的,用完就销毁还是可以节约很多的资源开销的。
下面就是vagrant destroy命令的运行状态:
$ vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y
[default] Forcing shutdown of VM...
[default] Destroying VM and associated drives...
$ vagrant status
Current machine states:
default not created (virtualbox)
The environment has not yet been created. Run `vagrant up` to create the environment. If a machine is not created, only the default provider will be shown. So if a provider is not listed, then the machine is not created for that environment
客户机在销毁之前会让你确认是否执行这个拉风的命令,一单你输入了Y确定,就会销毁你所有没有和宿主机共享的文件,如果你不想核实是否销毁也可以直接的跳过,命令如下:
$ vagrant destroy --force
[default] Forcing shutdown of VM...
[default] Destroying VM and associated drives.
然后,当你再次启动的时候会重新的创建虚拟客户机:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider... [default] Importing base box 'precise64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports... [default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces... [default] Preparing network interfaces based on configuration... [default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 80 => 8080 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes. [default] VM booted and ready for use!
[default] Configuring and enabling network interfaces... [default] Mounting shared folders...
[default] -- /vagrant
Provisioning Your Vagrant VM( 预配你的vagrant 虚拟机)
根据前面的介绍我们知道了,可以简单的运行vagrant up开启一个已经准备好的完整开发环境,也就是说所有项目必备的相关软件已经在客户机中预安装好了,这里有两种方式可以做到这点:1 ,直接的将软件嵌进box中 2 , 预安装软件作为启动的一部分在启动的时候自动下载安装。预配器就是属于第二种。
我们在练习的过程中,安装的客户机一般都是裸机,能够运行最小环境的软件安装预安装数量。
预配器同时支持shell scripts, Chef, or Puppet. 如果需要可以通过插件添加它。
为啥需要自动预配器?
自动的预配器有三个好处:易上手,重复用,缩小开发和生产环境之间的差距。真是可怜看到这突然想到,可能很多人都没有三个优点。
很多的开发着一般都会在服务器被创建的时候手动的从机器上复制,粘贴上传到对应的服务器上,但是当我们需要连接多个服务器时,可能会因为服务器之间的细微差距导致文件句柄耗尽,或数据库版本不兼容等一些其他的我想不到和没有碰到的问题。。。因为这些不可预测的问题,加上开发进度调的持续滚动,让我们没有那么多的时间去处理这些问题,就会出现一个常见的踢皮球的问题“这个项目在我的机器上运行时正常的”。
支持的预配器
Vagrant支持的预配器有shell scripts, Chef, or Puppet,对于新手来说经常会有疑惑那个预配器时Vagrant用的。最常听到的就是Chef or Puppet比较合适,但是它们都太复杂了。(Chef or Puppet说实话在我准备翻译这本书的时候,从来都没有听过这两个东西时啥,就是现在我也说不清,读者有兴趣的话可以自行的查阅)。为了简单哪这里就用shell script对这个不熟的可以自己去google一下看看.
手动设置Apache
使用适配器之前,我们先通过ssh手动安装和配置Apache,这个是非常有必要的,因为我们要在进行自动设置之前知道自己要干嘛。首先我们创建如下Vagrantfile文件:
Vagrant::Config.run do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.forward_port 80, 8180
end
然后启动机器:
==> default: Checking if box 'bento/ubuntu-18.04' is up to date...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 80 (guest) => 8180 (host) (adapter 1)
default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2200
default: SSH username: vagrant
default: SSH auth method: private key
启动完成后,使用vagrant ssh连接机器,这里使用的是Ubuntu系统,使用的Apt的包管理下载和安装工具,如果不熟悉的可以自己去google搜一下,至于一直以来我都没有说过baidu这个网站,因为我一直觉得baidu是个做外卖的,不是做搜索引擎的,就好像一个厨子不好好的烧饭,非要告诉我母鸡的阉割技术一样,你能服众吗?
进入系统后们要sudo apt-get update命令下载安装软件之前更新一下:
$ sudo apt-get update
Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:5 http://security.ubuntu.com/ubuntu bionic-security/main i386 Packages [846 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1,726 kB]
Get:7 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [1,399 kB]
Get:8 http://security.ubuntu.com/ubuntu bionic-security/main Translation-en [276 kB]
Get:9 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [166 kB]
Get:10 http://security.ubuntu.com/ubuntu bi
一般情况下,我们在ubuntu系统中使用sudo这个命令的时候都会让我们输入密码获得相应的使用权限,这里要注意一下sudo命令没有输入任何密码确认,这是因为Vagrant的box是被配置过的不会要求输入sudo密码,包更新完毕用apt-get搜索并且安装Apache软件,你这边的输出结果可能和我的有些微不同只要是没有报错,都能安装成功。
$ sudo apt-get install apache2
Reading package lists... Done
Building dependency tree
...
默认情况下Ubuntu是从 /var/www 文件夹下读取服务的配置文件,为了简单起见我们给***/var/www***创建一个软链接这样我们每次共享文件夹下的文件就能直接的被Apache服务读到,就不用来回的切换修改
$ sudo rm -rf /var/www/html
$ sudo ln -fs /vagrant /var/www/html
$ cd /vagrant
$ touch index.html
$ echo "<strong>Are you OK!</strong>" > index.html
在**/vagrant文件夹中创建文件然后在自己的宿主机浏览器上敲 ***http://IP_ADDRESS:8180就能看到对应的数据出现。这样我们就成功的在我们的虚拟机中配置了一个简单的Apache服务,使用我们的熟悉的编辑器在vagrant下编辑文件,然后刷新浏览器页面从虚拟机中读取对应的文件内容。
想象一下每次都要这样使用vagrant up*启动然后编辑文件还是挺烦人的,这个时候自动化的预配器配置就是将我们脱离苦海的那个摆渡人。还能让我们配置的环境共享给整个团队使用,让开发成为一种乐趣–> 这里是胡扯的啊,不加班的开发才会有乐趣!!!
自动化预配器基础动作
Shell Scripts
Shell脚本最简单的形式就是一坨运行命令的排列,我们创建一个前面的运行的脚本文件provision.sh:
#!/usr/bin/env bash
echo "Installing Apache and setting it up..." apt-get update >/dev/null 2>&1
apt-get install -y apache2 >/dev/null 2>&1
rm -rf /var/www/html
ln -fs /vagrant /var/www/html
当Shell脚本写好了,下面就是在Vagrantfile文件中配置这个脚本添加下面一行,告诉Vagrant启动机器的使用使用下面的脚本启动,这里的位置是相对于项目的根目录:
Vagrant::Config.run do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.forward_port 80, 8180
config.vm.provision "shell", path: "provision.sh"
end
当我们在验证脚本是否能成功运行之前,要先用vagrant destroy命令销毁前面创建的虚拟机,如果你前面没有创建任何的虚拟机,vagrant destroy会告诉你不需要销毁任何的机器,不会有啥事的。
#文件结构
$ tree
.
├── Vagrantfile
├── index.html
└── provision.sh
0 directories, 3 files
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/ubuntu-18.04'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/ubuntu-18.04' is up to date...
==> default: Setting the name of the VM: ubuntu_test_default_1604709863749_91060
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
这个启动可能比前面的示例多花几分钟,一旦启动成功在浏览器输入http://:8180,你会看到和你前面手动创建一样的预览效果。不需要任何的手动修改,创建成功,所有的基础web开发环境都创建好了。就这一个脚本可能不好想象有多便利,我们可以想象一下如果我们的环境同时需要,数据库,web server,redis,crons等等。事实上,这就是Vagrant现实世界的样子,为不同的团队提供各种独立的定制化开发环境。至于Chef和Puppet有兴趣的朋友可以自己上网拓展一下。这里的适配器是可以同时使用多个的,像一个Vagrantfile可以出现Shell和Chef连个适配器。
“No Provision”模式
我们使用适配器模式可能因为各种复杂的配置启动时间花费比较长,这时我们可以临时禁用适配器模式:
$ vagrant up --no-provision
通常的使用场景是Vagrantfile添加了新的配置在reload的时候我们又不想等太长时间让适配器重新加载一次
In-Depth Provisioner Usage(深度解析Provisioner)
现在我们已经知道了基础的Provisioner的用法,下面的这一章节作为***参考资料***更合适,如果你觉得基础的用法就已经够用了,直接的跳过,不要犹豫,节约点时间陪家人。
Shell Script(Shell 脚本)
Shell脚本因它的灵活性彰显了独特的魅力,从极简到极繁随心索欲。下面我们就看Vagrant提供的shell的更简单的用法或一些傻瓜式的配置。
Inline scripts(内联shell)
在前面的演示中我们用的是外部shell脚本,但很多的时候我们可能就是想简单的运行一个更新,写一个外部的脚本就有点大材小用了,毕竟杀鸡焉用牛刀。这时我们就用可以这种内联的方式:
config.vm.provision "shell", inline: "apt-get install -y apache"
指定了内联脚本,Vagrant就会用默认的shell去执行命令,这样非常的方便快捷并且是一次性的执行任务。
Run-once scripts
对于正式的配置管理系统随着功能的增长配置也会幂次方的增长,也就是说多次运行输出相同的结果,Shell脚本不是多次运行,但是要做到这点也是挺烦人的。
不过有个技巧就是运行时先检测是否文件存在,像这样:
if [ -f "/var/vagrant_provision" ]; then exit 0
fi
# Actual shell commands here.
touch /var/vagrant_provision
Chef Server
Puppet
上面两个没有接触过,也没有听谁用过,就没有研究
Networking in Vagrant(Vagrant网络)
下面我们会利用虚拟机中安装的Apache配置网络,如果你还没有安装,现在快速的花点时间配置好你的Vagrantfile 启动虚拟机。后面的事例会用这个运行的Apache虚拟机演示网络工作原理,优势和相互之间连接的成本。
Forwarded Ports (端口转发)
通过端口转发,你可以设置宿主机到客户机的端口映射,通过端口进入客户机服务。
前面的服务我们已经用到了端口转发,所以这个功能严格的说也不是新的功能,在这里只是做个详细的解释,例如:Apache 服务的80端口映射到宿主机的8080端口,我们在浏览器中访问8080端口时其实Vagrant已经转发到了客户机的80端口。
Pros and Cons(优缺点)
端口转发的优点我们只要简单的在Vagrantfile中配置一下就好了,告诉Vagrant端口要转发到哪里去。
这个看似简单的端口转发也有麻烦的地方,首先,要确切的知道每个端口的转发地址,比如简单的web服务,这个没啥就一个端口映射一下就可以了,但对于那些复杂的服务像数据库,同时要监听多个端口,越来越多的端口配置很快就会让我们的Vagrnatfile变得像裹脚布一样。
端口的对外映射也会暴露你的端口给公网,存在一定的安全隐患,尤其是对一些防火墙有漏洞或者是没有启动防火墙的人来说。对于安全性和隐私比较敏感的朋友,端口映射的时候要仔细的设置好自己的保护措施,一次的擦枪走火就有可能从苞米变成爆米花,到时候被喜当爹就真的是幸福满满了。防护是以防万一 就是不知道我们那一次才能叫做 ‘万一’ 才需要全面的防护
注意,端口映射不能转发小于1024的端口,这个是因为操作系统不允许非管理员权限进程托管这些端口,比如Vagrant。这个主要是会影响SSL的测试别的也没啥,况且我们还可以用Nginx进行反向代理,影响也不会很大
Basic Usage(基础用法)
前面我们用过端口转发就像这样:
config.vm.forwarded_port 80, 8080
第一个参数是客户机的端口,第二个是宿主机的端口。
多个端口映射可以配置多行,配置好后reload才会生效
Collision Detection and Correction(冲突检测和校正)
Vagrant有自己的端口碰撞检测,以防映射的端口被占用,一旦检测到端口冲突会有错误提示,换个端口就可以了。
或者,Vagrant会自动校正冲突的端口给你分发一个空置的端口号,这个必须要明确的指定要不就会很奇怪为啥和自己配置的端口映射号不一样,启动自动校验机制配置如下就可以了:
config.vm.forwarded_port 80, 8080, auto_correct: true
如果Vagrant发现端口占用会自动分配一个未使用的端口给你,Vagrant会自动在2200-2250之间选一个端口,范围是Vagrant内定的,也可以自定义:
config.vm.usable_port_range = (2200..2250)
TCP versus UDP(TCP 对 UDP)
转发端口协议默认是TCP,如果你想用UDP协议,可以改变端口协议:
config.vm.forwarded_port 80, 8080, protocol: "udp"
这个端口就只能用在UDP协议,如果你想同时支持两种协议,那就必须声明两种端口转发。
Host-Only Networking
Host-Only 网络,在客户机和宿主机之间创建一个私有网络,因为这是新的,自定义的网络它拥有自己的IP地址
Vagrant支持自定义的host-only网络会分配一个固定IP地址给虚拟机,你可以通过这个分配的固定IP访问客户机的服务,不需要在配置啥端口转发,省去了很多的麻烦。
Pros and Cons(优缺点)
Host-only是指只能宿主机和客户机进入这个网络,别的电脑哪怕是在同一个局域网下也不能访问这个固定IP,这就是把双刃剑。
优点是Host-only网络是个孤岛网络相对来讲很安全,除了你的宿主机别的电脑无法通过IP访问你运行的服务,但是有没有可能被别人黑掉,当然有,比如你睡觉的时候小偷进入你家把你的硬盘偷走了,这个是我把它叫做–物理黑客。
缺点是,因为它的孤岛效应,你的同伴就没法进入你的网络就不晓得你到底干的咋样了,也看不到你的工作进度。如果有问题需要联调的话就比较麻烦,这样的环境就不适合用host-only模式。
还有一个优点就是host-only网络可以让多个相同网段的虚拟机之间互相通信。端口转发不能让不同的虚拟机之间相互通信。Host-only网络只要是同一个网段知道彼此的IP地址就能够通信,要想测试这功能可以将web服务和数据库服务相互拆开,安装在不同的虚拟机中。
此外,host-only模式可以多虚拟机之间相互通信,也可以和宿主机之间通信,如果你想通过虚拟机进入宿主机的服务会很有帮助,端口转发只能宿主机进入虚拟机而不能反过来。
Basic usage(基本用法)
要是想配置host-only网络在Vagrantfile文件中加一句话就可以了:
config.vm.network "hostonly", "192.168.33.10"
第一个参数是hostonly网络配置,第二个参数是固定IP。
这个地址你可以自己随便来,只要你喜欢管他是谁的媳妇那。
配置完成后reload一下,vagrant会自动加载配置的新网络。机器启动后可以用ping检验一下:
$ ping 192.168.33.10
PING 192.168.33.10 (192.168.33.10): 56 data bytes
64 bytes from 192.168.33.10: icmp_seq=0 ttl=64 time=0.412 ms
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.364 ms
同时也可以反过来从客户机中ping宿主机:
$ vagrant ssh
#这个地址根据你的宿主机IP来定
vagrant@precise64:~$ ping 192.168.33.1
PING 192.168.33.1 (192.168.33.1) 56(84) bytes of data.
64 bytes from 192.168.33.1: icmp_req=1 ttl=64 time=0.197 ms
64 bytes from 192.168.33.1: icmp_req=2 ttl=64 time=0.216 ms
64 bytes from 192.168.33.1: icmp_req=3 ttl=64 time=0.378 ms
不同的操作系统可能配置会有差异,Vagrant会根据你的系统来配置相应的网络配置,如果你用的系统因为某些原因无法配置成功,会给你抛一个错误的。不过不用担心,因为你担心也没有用,你也不会改系统源码,虽然是开源的。
Bridged Networking(桥接网络)
Vagrant支持桥接网络,开启后宿主机会通过DHCP给客户机分配一个IP。这样你的虚拟机会以物理机的形式出现在网络中,同一个局域网的伙伴就可以随时的进入你的虚拟机了,只要是大家在同一个网段就没有问题啦。
Pros and Cons(优缺点)
桥接拥有host-only网络的优点,同时又没有像host-only网络那样的孤岛效应,还可以用不同的设备连接你的服务比如你的破手机,还能和自己的同伴分享你的工作,告诉他们你今天写了多少的bug。
没有孤岛效应是个优点也是个缺点,如果你的项目需要桥接的同时又需要对应的孤岛效应,凉凉。。。。
最明显缺点就是Vagrant不会指定固定IP给客户机,客户机的IP是通过DHCP随机分发的,要是想知道IP地址就必须得用SSH进入虚拟机,然后通过命令查找本机的IP,host-only是固定IP就不会有这样的麻烦。
另外一个缺点就是,桥接会依附路由的规则,有些特殊的场合桥接网络就没有啥用,比如:机场,旅馆。这些场合的网络会阻止局域网之间的机器相互之间联系,即使你知道客户机的IP也不能通信,这个时候你就别无选择了还是要换成host-only模式。
Basic usage
桥接网络配置如下:
config.vm.network "bridged"
告诉Vagrant给虚拟机开启桥接网络模式,IP直接的由DHCP动态的分发。然后reload或up一下让配置生效。在启动的时候Vagrant会问你要桥接到那个网络设备上,如果你不知道就选择和你的物理机连接网络一样的设备。下面是vagrant up的时候输出,我的电脑是用的WIFI连接的网络:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider... [default] Importing base box 'precise64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports... [default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces... [default] Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) p2p0
3) vnic0
4) vnic1
What interface should the network bridge to? 1
[default] Preparing network interfaces based on configuration... [default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few m
因为地址是DHCP自动分发的,我们就需要进入虚拟机内部探索我们的IP地址是啥:
$ vagrant ssh
vagrant@precise64:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:88:0c:a6
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe88:ca6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:332 errors:0 dropped:0 overruns:0 frame:0
TX packets:225 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:40678 (40.6 KB) TX bytes:31408 (31.4 KB)
eth1 Link encap:Ethernet HWaddr 08:00:27:60:3e:01
inet addr:10.0.1.31 Bcast:10.0.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe60:3e01/64 Scope:
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:1216 (1.2 KB) TX bytes:1494 (1.4 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
一般情况下第二个是桥接的设备,不过这个也不一定,因情况而定不过这里是这样的。上面的输出我们能看出桥接设备是eth1IP是10.0.1.31,可以检验一下这个IP能不能ping的通:
$ ping 10.0.1.31
PING 10.0.1.31 (10.0.1.31): 56 data bytes
64 bytes from 10.0.1.31: icmp_seq=0 ttl=64 time=0.696 ms
64 bytes from 10.0.1.31: icmp_seq=1 ttl=64 time=0.330 ms
64 bytes from 10.0.1.31: icmp_seq=2 ttl=64 time=0.521 ms
64 bytes from 10.0.1.31: icmp_seq=3 ttl=64 time=0.286 ms
能ping通网络就没有问题
最后
以上就是寒冷爆米花为你收集整理的vagrant 使用 BetaVagrant使用 Beta的全部内容,希望文章能够帮你解决vagrant 使用 BetaVagrant使用 Beta所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复