我怎样才能从另一个 virtualbox 来宾访问一个 vagrant 来宾?
How can I access a vagrant guest from another virtualbox guest?
场景是我的开发环境在我的笔记本电脑(主机)上的 Vagrant 盒子上,我想在 vitualbox 虚拟机中进行浏览器测试,所以我需要从一个虚拟机看到另一个虚拟机。
vagrant box 的端口是:8080,转发到同一端口上的主机:8080。所以我可以从 localhost:8080
的主机看到服务器
浏览器测试虚拟机应该使用哪个地址?
测试虚拟机的默认网关?
vagrant vm 的 ip?
主机的虚拟网络ip?
我应该在浏览器测试虚拟机上使用 NAT 还是仅主机适配器?
这产生了很多组合,我相信我已经尝试过所有组合。我还需要在这里了解什么?
在您的用例中,您应该使用桥接网络(Public Vagrant 中的网络)。如果 VM 驻留在同一台主机上,您甚至可以使用内部(Vagrant 中的专用网络)。
如果使用 Public 网络,VM 的第二个 NIC 将能够从网络中的 DHCP 服务器(例如您的家庭路由器)获取 IP 地址。
只需在您的 Vagrantfile
中添加以下代码块并执行 vagrant reload
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
您应该可以使用 vagrant ssh
和 ifconfig
/ ip addr show
.
获取 IP 地址
添加到已接受的答案中,您实际上可以设置 IP 并指定要使用的网络接口。
我通过 wifi 和静态 IP 在 linux 盒子上的设置:
您可以通过 运行 ifconfig
命令找到您的 wifi 接口名称。
Vagrant.configure("2") do |config|
config.vm.network "public_network", :bridge => 'wlp8s0', ip: "192.168.1.199"
end
如果您不想像我一样使用 public_network
那么您应该使用 private_network
:
执行以下步骤
- 从您的项目根目录打开
Vagrantfile
- 搜索
config.vm.network
- 添加此行
config.vm.network "private_network", ip: "192.168.33.10"
。请记住,这不是您的基础机器的 IP,它是一个虚拟机 IP 地址,您的机器 IP 应该不同。你可以说这是一个假的 IP 地址,所以把它改成其他任何东西,比如 192.168.30.20
.
- 使用
vagrant reload
重新加载你的 vagrant。
- 现在转到您的另一个虚拟访客,在我的例子中是
Windows Guest 2
。我的基地是 Linux Mint
Vagrant box 在 Ubuntu Guest 1
。以管理员身份打开 C:\Windows\System32\drivers\etc\hosts
文件,然后像 192.168.33.10 local.youralias.com
一样在其中输入上述 IP。并保存文件,之后您现在可以在 http://local.youralias.com/. 浏览站点
- 如果您的访客 2 也是 Linux,只需编辑此文件
sudo vi /etc/hosts
,并在其顶部添加此行 192.168.33.10 local.youralias.com
。现在保存并退出并浏览 URL :)
尽情享受吧!编码愉快。
老问题,新答案:[免责声明:我不是流浪专家]
两种解决方案都可能有效,但 "vagrant way of thinking" 中的解决方案是您的来宾中的某些组件(rinetd?)应该将任何对未知端口的请求转发给主机。然后可以将请求从主机映射(通过 vagrant 端口转发)到另一个来宾中 运行 的服务。
所以,继续:
1.in guest-1 我们做 localhost:1234。 Guest-1 将检测到此端口不可用并转发给主机
2.主机会检查vagrant端口转发并转发给guest-2
3. 在 guest-2 中,我们有一些不错的服务可以监听 post 1234
4. 完成。
这可能有很多根源。就我而言,我使用 vagrant fedora boxe。
我试过了:
首先使用我附加到仅主机适配器的 private_network 并启动 httpd 服务来测试来宾和主机之间的连接
config.vm.network "private_network", type: "dhcp", name: "vboxnet2"
config.vm.network "forwarded_port", guest:80, host:7070
但我无法从主机 ping 我的来宾计算机,也无法远程登录打开的 httpd 服务
第二次使用public_network并启动httpd服务来测试连通性
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", use_dhcp_assigned_default_route: true
我可以从我的主机 ping 我的来宾,但我无法远程登录 httpd 服务。
对于这两个用例,问题是 fedora 来宾主机上的端口 80 被防火墙阻止了。这是解决问题并使 privat_network 和 public_ntwork 都正常工作的方法:
firewall-cmd --permanent --add-port 80/tcp #open the port permanently
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --list-port # list to check if the port was opened
systemctl stop firewalld # stop and open the firewall service
systemctl start firewalld
场景是我的开发环境在我的笔记本电脑(主机)上的 Vagrant 盒子上,我想在 vitualbox 虚拟机中进行浏览器测试,所以我需要从一个虚拟机看到另一个虚拟机。
vagrant box 的端口是:8080,转发到同一端口上的主机:8080。所以我可以从 localhost:8080
的主机看到服务器浏览器测试虚拟机应该使用哪个地址?
测试虚拟机的默认网关? vagrant vm 的 ip? 主机的虚拟网络ip?
我应该在浏览器测试虚拟机上使用 NAT 还是仅主机适配器?
这产生了很多组合,我相信我已经尝试过所有组合。我还需要在这里了解什么?
在您的用例中,您应该使用桥接网络(Public Vagrant 中的网络)。如果 VM 驻留在同一台主机上,您甚至可以使用内部(Vagrant 中的专用网络)。
如果使用 Public 网络,VM 的第二个 NIC 将能够从网络中的 DHCP 服务器(例如您的家庭路由器)获取 IP 地址。
只需在您的 Vagrantfile
中添加以下代码块并执行 vagrant reload
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
您应该可以使用 vagrant ssh
和 ifconfig
/ ip addr show
.
添加到已接受的答案中,您实际上可以设置 IP 并指定要使用的网络接口。
我通过 wifi 和静态 IP 在 linux 盒子上的设置:
您可以通过 运行 ifconfig
命令找到您的 wifi 接口名称。
Vagrant.configure("2") do |config|
config.vm.network "public_network", :bridge => 'wlp8s0', ip: "192.168.1.199"
end
如果您不想像我一样使用 public_network
那么您应该使用 private_network
:
- 从您的项目根目录打开
Vagrantfile
- 搜索
config.vm.network
- 添加此行
config.vm.network "private_network", ip: "192.168.33.10"
。请记住,这不是您的基础机器的 IP,它是一个虚拟机 IP 地址,您的机器 IP 应该不同。你可以说这是一个假的 IP 地址,所以把它改成其他任何东西,比如192.168.30.20
. - 使用
vagrant reload
重新加载你的 vagrant。 - 现在转到您的另一个虚拟访客,在我的例子中是
Windows Guest 2
。我的基地是Linux Mint
Vagrant box 在Ubuntu Guest 1
。以管理员身份打开C:\Windows\System32\drivers\etc\hosts
文件,然后像192.168.33.10 local.youralias.com
一样在其中输入上述 IP。并保存文件,之后您现在可以在 http://local.youralias.com/. 浏览站点
- 如果您的访客 2 也是 Linux,只需编辑此文件
sudo vi /etc/hosts
,并在其顶部添加此行192.168.33.10 local.youralias.com
。现在保存并退出并浏览 URL :)
尽情享受吧!编码愉快。
老问题,新答案:[免责声明:我不是流浪专家]
两种解决方案都可能有效,但 "vagrant way of thinking" 中的解决方案是您的来宾中的某些组件(rinetd?)应该将任何对未知端口的请求转发给主机。然后可以将请求从主机映射(通过 vagrant 端口转发)到另一个来宾中 运行 的服务。
所以,继续:
1.in guest-1 我们做 localhost:1234。 Guest-1 将检测到此端口不可用并转发给主机 2.主机会检查vagrant端口转发并转发给guest-2 3. 在 guest-2 中,我们有一些不错的服务可以监听 post 1234 4. 完成。
这可能有很多根源。就我而言,我使用 vagrant fedora boxe。 我试过了:
首先使用我附加到仅主机适配器的 private_network 并启动 httpd 服务来测试来宾和主机之间的连接
config.vm.network "private_network", type: "dhcp", name: "vboxnet2" config.vm.network "forwarded_port", guest:80, host:7070
但我无法从主机 ping 我的来宾计算机,也无法远程登录打开的 httpd 服务
第二次使用public_network并启动httpd服务来测试连通性
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", use_dhcp_assigned_default_route: true
我可以从我的主机 ping 我的来宾,但我无法远程登录 httpd 服务。
对于这两个用例,问题是 fedora 来宾主机上的端口 80 被防火墙阻止了。这是解决问题并使 privat_network 和 public_ntwork 都正常工作的方法:
firewall-cmd --permanent --add-port 80/tcp #open the port permanently
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --list-port # list to check if the port was opened
systemctl stop firewalld # stop and open the firewall service
systemctl start firewalld