我怎样才能从另一个 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 sshifconfig / 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:

执行以下步骤
  1. 从您的项目根目录打开 Vagrantfile
  2. 搜索 config.vm.network
  3. 添加此行 config.vm.network "private_network", ip: "192.168.33.10"。请记住,这不是您的基础机器的 IP,它是一个虚拟机 IP 地址,您的机器 IP 应该不同。你可以说这是一个假的 IP 地址,所以把它改成其他任何东西,比如 192.168.30.20.
  4. 使用 vagrant reload 重新加载你的 vagrant。
  5. 现在转到您的另一个虚拟访客,在我的例子中是 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/.
  6. 浏览站点
  7. 如果您的访客 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