Vagrant之所以受到开发者和DevOps工程师的欢迎,是因为他们可以在本地系统上继续使用现有的开发工具(如编辑器、浏览器、调试器等)。例如,开发人员可以将客机上的文件同步到本地系统,使用他们最喜欢的编辑器来编辑这些文件,最后再同步回客机上。同样,如果他们在虚拟机上创建了一个Web应用程序,他们可以从本地系统的Web浏览器访问和测试该应用程序。在本指南中,我们将看到如何在Vagrant中配置网络,以提供从本地主机系统访问客人机的功能。
在Vagrant中配置网络
Vagrant提供以下三种网络选择:
1、端口转发
2、专用网络(仅主机网络)
3、公共网络(桥接网络)
1、配置端口转发
默认情况下,我们可以使用ssh通过ssh访问Vagrant VM vagrant ssh。当我们通过SSH访问VM时,Vagrant将端口22从来宾计算机转发到主机中的开放端口。这称为端口转发。Vagrant会自动处理此端口转发过程,而无需任何用户干预。您还可以转发您选择的特定端口。例如,如果将来宾计算机中的端口80转发到主机上的端口8080,则可以通过导航到主机上的http://localhost:8080来访问Web服务器。
可以在“ Vagrantfile”中配置端口转发。转到您的Vagrant项目目录,然后在您喜欢的编辑器中打开Vagrantfile。
找到以下行:
Vagrant.configure("2") do |config|
[...]
# config.vm.network "forwarded_port", guest: 80, host: 8080
end
取消注释,并定义将哪些端口转发到哪里。在此示例中,我将来宾中的端口80转发到主机中的端口8080。
Vagrant.configure("2") do |config|
[...]
config.vm.network "forwarded_port", guest: 80, host: 8080
end
现在,使用更新的Vagrantfile重新启动Vagrant计算机:
$ vagrant reload --provision
您将在输出中看到配置了端口转发:
您也可以销毁VM,然后使用更新的Vagrantfile重新运行它:
$ vagrant destroy <VM-name>
$ vagrant up
现在,使用以下命令SSH登录到客户机:
$ vagrant ssh
在其中安装Apache Web服务器。如果虚拟机基于Deb,请运行:
$ sudo apt install apache2
如果是基于RHEL的系统,请运行以下命令:
$ sudo yum install httpd
启动Apache服务:
$ sudo systemctl enable --now httpd
现在,在主机系统中打开Web浏览器,然后从浏览器导航到http://localhost:8080地址。您将在浏览器上看到Apache测试页。
即使我们在主机系统中使用URLhttp://localhost:8080访问Web服务器,也不会从本地Web服务器提供该服务器。来宾虚拟机正在提供实际的网站(即Apache测试页),并且所有实际的网络数据都将发送给来宾。
1.1、如果另一个应用程序正在使用端口8080,该怎么办?
在前面的示例中,我们将端口80从来宾转发到主机中的端口8080。换句话说,发送到端口8080的流量实际上已转发到客户机上的端口80。如果其他应用程序当前正在使用端口8080怎么办?运行多个虚拟机时发生端口冲突。您可能在不知不觉中转发了已使用的端口。别担心!Vagrant具有检测端口冲突的内置支持。如果该端口已被其他应用程序使用,则Vagrant会在输出中报告该端口,因此您可以释放该端口或使用其他端口。
Vagrant也足够智能,可以自动查找和纠正端口冲突。如果发现某个端口与另一个端口冲突,它将通过使用任何其他未使用的端口来自动更正它。
要启用自动校正,请auto_correct: true在Vagrantfile的端口转发定义中添加一个附加选项。
Vagrant.configure("2") do |config|
[...]
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true end
默认情况下,Vagrant将在端口2200和端口2250之间选择自动校正端口。您还可以通过在Vagrantfile中定义以下行来选择自己的自定义范围,如下所示。
config.vm.usable_port_range = (2200..2250)
重新启动Vagrant机器以使更改生效:
1.2、更改网络协议
默认情况下,Vagrant使用TCP协议进行端口转发。但是,如果要转发UDP数据包,则可以使用UDP协议。要使用UDP端口,请在Vagrantfile中添加以下定义:
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true protocol: "udp"
重新启动Vagrant VM,以使更改生效。
2、配置专用网络
在专用或仅主机网络中,将在主机系统和主机系统上的VM之间创建网络连接。专用网络是使用对主机操作系统可见的虚拟网络适配器创建的。网络上的其他系统无法与VM通信。主机系统中允许所有网络操作。
专用网络还可以充当DHCP服务器,并具有自己的子网。专用网络中的每个VM将从该IP空间获得一个IP地址。因此,我们可以使用主机系统中的IP直接访问VM。
要使用静态IP地址在Vagrant中配置专用或仅主机网络,请打开Vagrantfile,找到以下行并将其取消注释。
config.vm.network "private_network", ip: "192.168.121.60"
在这里,192.168.121.60是虚拟机的IP地址。用您自己的IP替换它。
重新启动VM,以使更改生效。
如果要通过DHCP自动设置IP地址,请按如下所示修改专用网络定义:
config.vm.network "private_network", type: "dhcp"
将为虚拟机分配一个随机IP地址。为了找到虚拟机的IP,您需要使用vagrant sshcommand SSH进入它,然后使用command找到它的IP地址ip。
3、配置公共网络
在公共或桥接网络中,所有VM都将与您的主机位于同一网络中。每个VM将从DHCP服务器(如果在本地网络中可用)接收其自己的IP地址。因此,所有VM都将像网络上的另一个物理系统一样工作,并且它们可以与网络中的任何系统进行通信。
要配置公共或桥接网络,请编辑Vagrantfile,找到以下行并取消注释:
config.vm.network "public_network"
保存并关闭文件。重新启动VM以应用更改。VM将自动获取IP地址。
如果要设置静态IP,只需修改网络定义,如下所示:
config.vm.network "public_network", ip: "192.168.121.61"
4、设置主机名
您可以使用config.vm.hostname Vagrantfile中的设置定义主机名 。
在您喜欢的编辑器中编辑Vagrantfile并添加/修改以下行:
config.vm.hostname = "myhost.ostechnix.example"
保存并关闭文件。上面的定义将myhost.ostechnix.example 在/etc/hosts文件中添加行。
重新启动Vagrant VM,以使更改生效。
验证主机名是否已更改:
[vagrant@myhost ~]$ hostname -f
myhost.osechnix.example
您也可以直接检查/etc/hosts文件的内容。
$ cat /etc/hosts
样本输出:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.1.1 myhost.osechnix.example myhost
5、启用多个网络选项
每个网络选项都有其自身的优势和劣势。由于某些原因,您可能希望将所有网络选项配置到单个VM。如果是这样,Vagrant可以启用多个网络选项。您所要做的只是在Vagrantfile中一个接一个地定义网络选项,如下所示:
config.vm.hostname = "myhost.ostechnix.example"
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
config.vm.network "private_network", ip: "192.168.121.60"
使用此Vagrantfile创建新的VM时,vagrant将创建具有以下网络详细信息的VM:
将主机名设置为myhost.ostechnix.example
配置端口转发
用静态IP 192.168.121.60配置一个私有网络
除了配置多种类型的网络外,我们还可以定义多种网络。例如,您可以定义多个具有不同IP地址的仅主机网络,如下所示。
config.vm.network "private_network", ip: "192.168.121.60"
config.vm.network "private_network", ip: "192.168.121.61"
在此阶段,您可能已经从命令行获得了有关Vagrant网络类型以及如何在Vagrant中配置网络的基本概念。还有更多的东西要学习。我建议您查看Vagrant的官方文档以获取更多详细配置。