Vagrant从虚拟机内部向宿主机进行ping或curl操作

12

我想知道如何在我的vagrant虚拟机上使用终端运行命令:

$ ping localhost:3000

或者

$ curl http://localhost:3000

在主机(OSX)上,我有一个运行在localhost:3000的rails服务器,所以我期望在rails日志中看到一些内容。

3个回答

24

当我在虚拟机中运行时:

$ ip route show

输出中会有一行类似于:

default via 10.0.2.2 dev enp0s3 proto static metric 1024

那就是从客户端ping的IP地址:

curl http://10.0.2.2:3000


10

在vagrant虚拟机中,localhost指的是客户端vagrant虚拟机,即localhost并不指代主机。从客户端访问主机的一种方式是配置私有网络。您可以为vagrant指定一个静态私有IP,如下所示:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"
end

在这之后,主机可以通过 192.168.50.4 访问来宾机,并且来宾机可以通过 192.168.50.1 访问主机,即主机的 IP 地址末位在来宾机中将变为 1

在运行 vagrant up 后,您可以在来宾机内执行以下操作:

$ ping 192.168.50.1
$ curl http://192.168.50.1:3000

请注意,如果您有一些严格的防火墙设置,则必须允许来自192.168.50.4的连接。


关于主机IP以1结尾的客户端的情况很有趣。这个有文档记录吗?如果将客户端IP设置为以1结尾的地址会发生什么?下面的代码是否无法正常工作?config.vm.network "private_network", ip: "192.168.50.1" - tobuslieven
1
我尝试了前十个,但都没有成功:curl: (7) Failed connect to 192.168.33.1:3000; No route to host - Emba Moussa
1
@tobuslieven,这个可以在由Vagrant的原始创建者撰写的《Vagrant: Up and Running》一书中找到。如果我没记错的话,它也出现在文档中。然而,我现在在当前版本的文档中找不到它了。 - taskinoor
@embasbm,请问你在Vagrantfile中放置的IP是什么?是192.168.50.4还是192.168.33.4?请提供您正在使用的Vagrantfile的确切行。此外,您应该检查您的防火墙设置。 - taskinoor
@taskinoor 这是我在Vagrantfile中得到的内容:config.vm.network "private_network", ip: "192.168.33.64" 可能与防火墙设置有关。 - Emba Moussa
你能从主机ping通客户端吗? $ ping 192.168.33.64 如果你可以从主机ping通客户端,但反过来不行,那么这可能是由于防火墙设置引起的。你可以暂时禁用防火墙,然后检查它是否正常工作。 - taskinoor

0

您还可以在虚拟机的配置文件中将网络设置为“public_network”。

Vagrantfile中,只需取消注释该行:

config.vm.network "public_network"

重新启动机器:

vagrant halt
vagrant up

执行 ip addr show 命令,公共网络上的 IP 地址将列在 eth1 下(而不是通常的 eth0 下)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接