我正在尝试启动Vagrant实例并收到以下消息:
Vagrant cannot forward the specified ports on this VM, since they
would collide with another VirtualBox virtual machine's forwarded
ports! The forwarded port to 4567 is already in use on the host
machine.
To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:
config.vm.forward_port 80, 1234
我打开了VirtualBox,但此刻我没有任何正在运行的盒子,所以我很难过。如何确定哪个进程正在侦听4567?有没有办法列出我机器上运行的所有Vagrant盒子?
谢谢, 凯文
答案 0 :(得分:60)
您可以通过运行
查看计算机上正在运行的vagrant实例$ vagrant global-status
id name provider state directory
----------------------------------------------------------------------
a20a0aa default virtualbox saved /Users/dude/Downloads/inst-MacOSX
64bc939 default virtualbox saved /Users/dude/svn/dev-vms/ubuntu14
a94fb0a default virtualbox running /Users/dude/svn/dev-vms/centos5
如果您没有看到任何正在运行的虚拟机,那么您的冲突就不是流浪汉(流浪者知道)。接下来要做的是启动VirtualBox UI,并检查它是否有任何实例在运行。如果您不想运行UI,可以:
ps -ef |grep VBox
如果您正在运行VirtualBox实例,则它们应包含在该输出中。您应该能够杀死其输出中包含VirtualBox的进程。一个问题是这些过程中的一个似乎存在以进行保持活动。刚刚杀掉最高的VirtualBox进程。如果您正在运行VirtualBox映像,但vagrant不知道它,则可能已手动删除了一些Vagrant目录,这意味着Vagrant将丢失对该实例的跟踪。
答案 1 :(得分:19)
注意,在启动Vagrant盒子/实例时,您的Vagrantfile 不是唯一一个。
当你得到这个:
~/dev/vagrant user$ vagrant reload
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 8001 is already in use
on the host machine.
To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:
config.vm.network :forwarded_port, guest: 8001, host: 1234
Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
~/dev/vagrant user$
您实际上不仅使用〜/ dev / vagrant中的Vagrantfile,还使用了#34;框中的Vagrant文件"分发.box文件,通常位于此处:
~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile
如果你看一下它,你会发现它有很多默认端口映射:
$ cat ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile
$script = <<SCRIPT
bzr branch lp:jujuredirector/quickstart /tmp/jujuredir
bash /tmp/jujuredir/setup-juju.sh
SCRIPT
Vagrant.configure("2") do |config|
# This Vagrantfile is auto-generated by 'vagrant package' to contain
# the MAC address of the box. Custom configuration should be placed in
# the actual 'Vagrantfile' in this box.
config.vm.base_mac = "080027DFD2C4"
config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"
config.vm.network "private_network", ip: "172.16.250.15"
config.vm.provision "shell", inline: $script
end
# Load include vagrant file if it exists after the auto-generated
# so it can override any of the settings
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)
因此,请继续编辑此文件以删除有问题的冲突转发端口:
config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
# config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"
人:
~/dev/vagrant user$ cp ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile.old
~/dev/vagrant user$ vi ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile
并注意包含其他Vagrantfiles,即:
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
现在它起作用了:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'trusty'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1401234565101_12345
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 => 2122 (adapter 1)
default: 80 => 6080 (adapter 1)
default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
default: /vagrant => /Home/user/dev/vagrant/vagrant-docker
==> default: Running provisioner: shell...
default: Running: inline script
...
希望这有帮助。
答案 2 :(得分:13)
如消息所示,端口与主机盒发生冲突。我只是将端口更改为主机上的其他值。所以,如果我收到错误
config.vm.forward_port 80, 1234
然后我会把它改成
config.vm.forward_port 80, 5656
因为1234可能在我的主机上使用。
为了实际检查任何机器上的端口,我使用tcpview
实用程序来获取该操作系统,并了解在哪里使用哪个端口。
答案 3 :(得分:9)
我遇到了这个问题,事实证明RubyMine仍然坚持使用端口。我通过运行此命令找出了哪个应用程序正在保留端口(在我的情况下为31337):
lsof -i | grep LISTEN
输出
node 1396 richard.nienaber 7u IPv4 0xffffff802808b320 0t0 TCP *:20559 (LISTEN)
Dropbox 1404 richard.nienaber 19u IPv4 0xffffff8029736c20 0t0 TCP *:17500 (LISTEN)
Dropbox 1404 richard.nienaber 25u IPv4 0xffffff8027870160 0t0 TCP localhost:26165 (LISTEN)
rubymine 11668 richard.nienaber 39u IPv6 0xffffff8024d8e700 0t0 TCP *:26162 (LISTEN)
rubymine 11668 richard.nienaber 65u IPv6 0xffffff8020c6e440 0t0 TCP *:31337 (LISTEN)
rubymine 11668 richard.nienaber 109u IPv6 0xffffff8024d8df80 0t0 TCP localhost:6942 (LISTEN)
rubymine 11668 richard.nienaber 216u IPv6 0xffffff8020c6ef80 0t0 TCP localhost:63342 (LISTEN)
答案 4 :(得分:5)
另请注意(至少在Vagrant 1.6.4中)有文件夹~/.vagrant.d/data/fp-leases
,文件名称为8080
,8081
等。删除此文件夹内容帮助我现在
答案 5 :(得分:1)
如果您使用Proxifier(或类似的应用程序),请先尝试关闭它。由于OSX 10.9上的Proxifier,我遇到了这个问题。
答案 6 :(得分:0)
我遇到此问题是因为我有一个试图运行Postgres的VM,并且我的Postgres在本地计算机上的端口5432上运行。
vagrant resume
之后,我得到了错误:
Vagrant无法转发此VM上的指定端口,因为它们 会与其他正在监听的应用程序发生冲突 在这些端口上。转发到5432的端口已在使用中 在主机上。
查看端口5432上正在运行什么:
o-ets-webdeveloper:portal me$ lsof -i :5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 1389 me 5u IPv6 0x681a62dc601cf1e3 0t0 TCP localhost:postgresql (LISTEN)
postgres 1389 me 6u IPv4 0x681a62dc6499362b 0t0 TCP localhost:postgresql (LISTEN)
原来是本地的Postgres,杀死了这些进程使我能够成功运行vagrant resume
。
答案 7 :(得分:0)
我以这种方式解决了这个问题
vagrant suspend
vagrant resume
答案 8 :(得分:0)
我的观察: 我没有在端口8000上运行任何进程,因此端口转发基本上不起作用。 固定: 菲尔的答案提供了解决方案
~/.vagrant.d/boxes/
上面的路径具有列出端口8000的其他版本的vagrant文件。使用以下命令将它们全部修剪后,便能够成功运行vagrant。
vagrant box remove [name] --all
答案 9 :(得分:0)
出路:
答案 10 :(得分:0)
Vagrant.configure(“ 2”)做| config |
config.vm.network“转发端口”,访客:80,主机:8080,
auto_correct: true
结束
最后的:auto_correct参数设置为true,告诉Vagrant自动更正任何碰撞。在无业游民补给或无业游民重新装填期间,Vagrant将输出有关任何碰撞检测和自动更正的信息,因此您可以注意到并采取相应行动。
https://www.vagrantup.com/docs/networking/forwarded_ports.html
答案 11 :(得分:0)
您必须使用以下命令在当前目录中修改Vagrant文件:
config.vm.network "forwarded_port", guest: 4567, host: <a port not used by your host machine>
请记住,还有一个隐藏文件夹(.vagrant.d /),其中包含您的流浪者环境的设置以及框的配置文件。通常,此文件夹位于您的主目录中。
例如
~/.vagrant.d/boxes/<your_box_name>/0/virtualbox/Vagrantfile
通常,该文件包括位于~/.vagrant.d/boxes/<your_box_name>/0/virtualbox/include/_Vagrantfile
您还必须使用port-forwarding命令修改此文件
答案 12 :(得分:-1)
在这里参考我的答案:https://superuser.com/a/1610804/1252585
再次写内容:
要列出所有的侦听端口:
$ netstat -a
使用以下命令查找在所需端口上运行的进程的进程ID:
$ netstat -ano | findstr :8080
结果将显示为:
$ netstat -ano | findstr :5000
TCP 0.0.0.0:5000 0.0.0.0:0 LISTENING 18024
此处,18024是PID或进程ID。
然后使用以下命令杀死8080上的进程:
$ taskkill /PID 18024 /F
或$ taskkill //PID 18024 //F
结果将显示为:
$ taskkill //PID 18024 //F
SUCCESS: The process with PID 18024 has been terminated.