🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

路径(九):用 Vagrantfile 配置虚拟机 — 网络

把虚拟机作为一台服务器,你就需要让主机(你的电脑)与虚拟机之间通过网络连接在一起,网络中的其它的设备也可能要跟虚拟机连接。这就需要去配置一下虚拟机的网络的设置,让主机或者其它设备可以访问到虚拟机。可以通过 Vagrantfile 去配置虚拟机的网络,Vagrant 提供了三种方法,端口转发,公有网络,还有私有网络。

端口转发

forwarded_port,端口转发,就是你可以设置主机与虚拟机之间的端口的映射关系,这样请求主机上的这个端口,就会把请求转发到虚拟机上的对应的端口上。比如,你想在访问主机 8080 端口时候,转发到虚拟机上的 80 端口,下面咱们去试一下,先打开 Vagrantfile ,然后搜索:

# config.vm.network "forwarded_port"

去掉这行代码最前面的 # 号, 这个配置就是端口转发,看起来是这样的:

config.vm.network "forwarded_port", guest: 80, host: 8080

最开始 config.vm.network,意思是这是 vm(虚拟机)的 network(网络)的配置,配置的是 forwarded_port(端口转发),要转发到虚拟机(guest)上的端口是 80,转发的是主机(host)上的 8080 端口。也就是你在访问主机上的 80 端口的时候,实际上访问的是虚拟机上的 8080 端口。

保存这个文件,然后启动或者重启虚拟机,这样配置才会生效。在启动虚拟机的时候,注意看 Vagrant 输出的信息,你会看到在 Forwarding ports 下面,有我们设置的端口转发。

==> default: Forwarding ports...
    default: 80 => 8080 (adapter 1)

测试

SSH 连接到虚拟机,Windows 用 Putty 去连接,Mac 用户可以直接用 vagrant ssh 命令连接到虚拟机。然后我们去给虚拟机安装一个 httpd(Apache),这是一款老牌的 Web 服务器。在 CentOS 上安装东西,可以用它的包管理工具(yum)。执行:

sudo yum install httpd

提示:

Is this ok [y/N]:

yum 会提示你,要安装的是这些东西,可以吗?输入 y ,然后回车,执行安装。最后会提示 Complete!  完成!再去启动一下 httpd :

sudo service httpd start

确定一下 httpd 这个服务已经启动成功了:

sudo service httpd status

返回:

httpd (pid xxxx) is running...

说明 httpd 这个服务正在运行中。注意在上面执行的这些命令的最前面都有一个 sudo ,意思是,使用超级管理员(root)的权限去执行命令,有些命令别人不能动,只能是超级管理员才可以。当前我们用的是 vagrant 用户登录到的虚拟机上,所以需要超级管理员权限的时候,你就要在命令前面加上一个 sudo 。

在你的电脑上,打开浏览器,输入:

http://localhost:8080

localhost 表示本地主机,也就是你的电脑,后面的 :8080 ,设置了一下端口号,因为我们把这个端口号转发到了虚拟机上的 80 这个端口,虚拟机的 httpd 服务默认使用的就是 80 端口,所以,你看到的其实是由虚拟机提供的 Web 服务。

QQ20150122-1

公有网络

除了主机以外,你还想让网络里面的其它设备也可以使用虚拟机上提供的服务,比如你可能想用手机或者平板访问搭建在虚拟机上的 Web 服务,这就需要去配置一下虚拟机的公有网络(public_network),这样虚拟机会被分配一个内部的 IP 地址,使用这个 IP 地址,就可以访问到虚拟机上的服务了。

先确定你的电脑在一个局域网环境里,并且网络里有路由器,这个路由器会在你的虚拟机启动的时候,分配给虚拟机一个内网的 IP 地址。

打开 Vagrantfile,搜索:

# config.vm.network "public_network"

上面这上行代码就是用来配置 公有网络 用的,去掉代码最前面的 # 号,可以让这条配置生效。保存文件,然后启动或重启虚拟机,你可能会看到类似下面这样的提示:

==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: 以太网
3) en2: Thunderbolt 1
4) en3: Thunderbolt 2
5) p2p0
6) awdl0
7) bridge0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
    default: Which interface should the network bridge to?

上面列出的选项是我的电脑上可用的一些上网方式,你看到的可能跟这个不一样,你要选择的就是你自己电脑的连接互联网的方式,我的电脑是用 Wi-Fi 上网的,所以,这里要选择 1 ,然后回车。

==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
...

启动以后,SSH 到虚拟机上,然后查看一下虚拟机的网络配置:

ifconfig

你应该会看到在 eth1 里面,inet addr 后面的值就是这台虚拟机的外部的 IP 地址,我这里是 192.168.1.136 ,因为我的路由器配置的就是用 192.169.1.x 这个网段的 IP ,所以,它再给虚拟机分配 IP 地址的时候,也会使用这个网段上的私有的 IP 地址。

eth1      Link encap:Ethernet  HWaddr 08:00:27:1F:52:74  
          inet addr:192.168.1.136  Bcast:192.168.1.255  ...

现在,启动之前安装在虚拟机上的 httpd 服务:

sudo service httpd start

然后打开你自己电脑上的浏览器,输入虚拟机的外部 IP 地址,我这里是 192.168.1.136,所以就是:http://192.168.1.136 。不出意外,你可以看到之前用测试端口转发的时候,打开的那个 Apache 的测试页面。再试一下,在同一网络里面,用其它的设备,打开虚拟机的这个 IP 地址,比如你的手机或者平板,应该同样可以看到这个 Apache 的测试页面。

  配置虚拟主机的公有网络

私有网络

你打算创建一个虚拟机与主机之间的私有网络,可以配置一下  private_network ,你可以为虚拟机手工指定一个 IP 地址,这个 IP 地址只有主机能访问到。打开 Vagrantfile,先注释掉之前配置公有网络用的代码:

# config.vm.network "public_network"

然后搜索下面的代码,找到以后去掉代码最前面的 # 号,:

# config.vm.network "private_network", ip: "192.168.33.10"

这里的 private_network 就是配置私有网络用的,注意后面手工指定了这台虚拟机在这个私有网络上的 IP 地址,默认是 192.168.33.10 ,你可以修改成任何的为私有网络保留的地址段里的 IP 地址,不过不能使用跟电脑内网一样的地址段,比如我的路由器上设置的内网的 IP 地址段是 192.168.1.x ,这样为这个虚拟机配置私有网络地址的时候,就不能用 192.168.1.x 这个地址段上的 IP 地址。

保存 Vagrantfile ,然后启动或重启虚拟机,可以让这个配置生效。启动时,会有这样的显示:

==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly

启动虚拟机以后,SSH 到虚拟机上,然后查看一下系统的网络配置:

ifconfig

返回的内容里可以找到:

eth1      Link encap:Ethernet  HWaddr 08:00:27:1F:52:74  
          inet addr:192.168.33.10

在主机(你的电脑) 上可以使用 192.168.33.10 访问到这台虚拟机,测试一下,先启动之前安装的 httpd 服务:

sudo service httpd start

然后在自己的电脑上打开浏览器,输入地址:

http://192.168.33.10

你应该可以看到 Apache 的测试页面。

  配置虚拟主机的私有网络

路径 Vagrant

评论

PS C:\Users\john\desktop\xiaorui-project> sudo yum install httpd
无法将“sudo”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重
试。
所在位置 行:1 字符: 5
+ sudo <<<< yum install httpd
+ CategoryInfo : ObjectNotFound: (sudo:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
王老师,这是为什么。我安装了vagrant,ssh也连接成功了

你需要用 Putty 连接到虚拟机, 然后在 Putty 上执行你想在虚拟机上执行的命令,比如 sudo yum install httpd ...

感觉vagrant在windows上不是很稳定,经常会起不来或者莫名就报错进不去了……请mac的同学回答一下有没有类似稳定性问题

暂时还没有。

我启动apache的时候总是提示Redirecting to /bin/systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. 错误

自己找到原因了,nginx占了80端口,httpd就没法启动了

"也就是你在访问主机上的 80 端口的时候,实际上访问的是虚拟机上的 8080 端口。"这句话的端口写反了

细心人 :)

你好 请问一下 vagrantfile里默认配置的虚拟机 和通过 config.vm.define 添加的虚拟机 有什么区别吗 添加后我怎么登陆到默认的虚拟机

你的虚拟机相关的配置应该都在 Vagrantfile 里面,你可以定义多个虚拟机,比如定义了一个叫 dev 的虚拟机,一个 local 虚拟机,连接到它们的时候使用 vagrant ssh dev 或 vagrant ssh local 。

王老师,请问vagrant虚拟机ubuntu里装了anaconda,怎么在windows的host机的浏览器上使用jupyter notebook啊?尝试了端口和私有网络都不行,提示ubuntu系统里没有浏览器: No web browser found: could not locate runnable browser.

设置端口转发应该可以。在虚拟机上执行 jupyter notebook,默认端口是 8888,你可以在 Vagrantfile 里面,设置一个端口转发,让主机上的某个端口转发到 jupyter notebook 默认的 8888 这个端口。比如:config.vm.network "forwarded_port", guest: 8888, host: 8080 ,这样在主机的浏览器上访问 localhost:8080 的时候,就会打开 jupyter notebook 。

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点