把虚拟机作为一台服务器,你就需要让主机(你的电脑)与虚拟机之间通过网络连接在一起,网络中的其它的设备也可能要跟虚拟机连接。这就需要去配置一下虚拟机的网络的设置,让主机或者其它设备可以访问到虚拟机。可以通过 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 服务。
公有网络
除了主机以外,你还想让网络里面的其它设备也可以使用虚拟机上提供的服务,比如你可能想用手机或者平板访问搭建在虚拟机上的 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也连接成功了
9 年 10 个月 以前
你需要用 Putty 连接到虚拟机, 然后在 Putty 上执行你想在虚拟机上执行的命令,比如 sudo yum install httpd ...
9 年 10 个月 以前
感觉vagrant在windows上不是很稳定,经常会起不来或者莫名就报错进不去了……请mac的同学回答一下有没有类似稳定性问题
9 年 10 个月 以前
暂时还没有。
9 年 10 个月 以前
我启动apache的时候总是提示Redirecting to /bin/systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. 错误
9 年 8 个月 以前
自己找到原因了,nginx占了80端口,httpd就没法启动了
9 年 8 个月 以前
"也就是你在访问主机上的 80 端口的时候,实际上访问的是虚拟机上的 8080 端口。"这句话的端口写反了
9 年 1个月 以前
细心人 :)
9 年 1个月 以前
你好 请问一下 vagrantfile里默认配置的虚拟机 和通过 config.vm.define 添加的虚拟机 有什么区别吗 添加后我怎么登陆到默认的虚拟机
8 年 9 个月 以前
你的虚拟机相关的配置应该都在 Vagrantfile 里面,你可以定义多个虚拟机,比如定义了一个叫 dev 的虚拟机,一个 local 虚拟机,连接到它们的时候使用 vagrant ssh dev 或 vagrant ssh local 。
7 年 1个月 以前
王老师,请问vagrant虚拟机ubuntu里装了anaconda,怎么在windows的host机的浏览器上使用jupyter notebook啊?尝试了端口和私有网络都不行,提示ubuntu系统里没有浏览器: No web browser found: could not locate runnable browser.
7 年 1个月 以前
设置端口转发应该可以。在虚拟机上执行 jupyter notebook,默认端口是 8888,你可以在 Vagrantfile 里面,设置一个端口转发,让主机上的某个端口转发到 jupyter notebook 默认的 8888 这个端口。比如:config.vm.network "forwarded_port", guest: 8888, host: 8080 ,这样在主机的浏览器上访问 localhost:8080 的时候,就会打开 jupyter notebook 。
7 年 1个月 以前