How to debug "Vagrant cannot forward the specified ports on this VM" message
I'm trying to start a Vagrant instance and getting the following message:
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
I opened VirtualBox, but I don't have any running boxes at the moment, so I'm stumped. How can I figure out which process is listening on 4567? Is there a way to list all Vagrant boxes running on my machine?
Thanks, Kevin
Solution 1:
You can see what vagrant instances are running on your machine by running
$ 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
If you don't see any VMs running, your conflict is not a vagrant box (that vagrant knows about). The next thing to do is to fire up the VirtualBox UI, and check to see if it has any instances running. If you don't want to run the UI, you can:
ps -ef |grep VBox
If you have VirtualBox instances running, they should be included in that output. You should be able to just kill processes that have VirtualBox in their output. One problem is that one of those processes seems to exist to do keep-alives. Just kill off the highest VirtualBox process. If you have a VirtualBox image running but vagrant doesn't know about it, some Vagrant directories may have been deleted manually, which means Vagrant loses track of the instance.
Solution 2:
Watch out, your Vagrantfile is not the only one being used when bringing up a Vagrant box/instance.
When you get this:
~/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$
You are actually not only using the Vagrantfile from ~/dev/vagrant but also the one from your "box" distribution .box file which is typically located here:
~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile
And if you have a look at it you'll see it has plenty of default port mappings:
$ 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)
So, go ahead and edit this file to remove the offending colliding forwarding port(s):
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"
By:
~/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
and watch out for other Vagrantfiles inclusion i.e.:
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
And now it works:
$ 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
...
Hope this helps.
Solution 3:
As message says, the port collides with the host box. I would simply change the port to some other value on the host machine. So if I am getting error for
config.vm.forward_port 80, 1234
then I would change it to
config.vm.forward_port 80, 5656
As 1234 might be used on my host machine.
For actually inspecting ports on any machine, I use the tcpview
utility for that OS and get to know which port is used where.
Solution 4:
I ran into this problem and it turned out RubyMine was still holding on to a port. I found out which application was holding on to the port (31337 in my case) by running this command:
lsof -i | grep LISTEN
Output
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)