J'essaie de démarrer une instance Vagrant et de recevoir le message suivant:
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
J'ai ouvert VirtualBox, mais je n'ai pas de box en cours d'exécution pour le moment, alors je suis perplexe. Comment savoir quel processus écoute sur 4567? Est-il possible de répertorier toutes les boîtes Vagrant en cours d'exécution sur ma machine?
Merci, Kevin.
Comme le message l'indique, le port entre en collision avec la zone Host. Je voudrais simplement changer le port pour une autre valeur sur la machine hôte. Donc, si je reçois une erreur pour
config.vm.forward_port 80, 1234
alors je changerais pour
config.vm.forward_port 80, 5656
Comme 1234 pourrait être utilisé sur mon ordinateur hôte.
Pour inspecter les ports de n’importe quel ordinateur, j’utilise l’utilitaire tcpview
correspondant à ce système d’exploitation et je découvre le port utilisé.
Vous pouvez voir quelles instances vagrant sont en cours d'exécution sur votre machine en exécutant
$ 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
Si vous ne voyez aucune machine virtuelle en marche, votre conflit n'est pas une boîte de vagabond (que vagabond sait). La prochaine étape consiste à lancer l'interface utilisateur de VirtualBox et à vérifier si des instances sont en cours d'exécution. Si vous ne voulez pas exécuter l'interface utilisateur, vous pouvez:
ps -ef |grep VBox
Si des instances de VirtualBox sont en cours d'exécution, elles doivent être incluses dans cette sortie. Vous devriez être capable de simplement tuer les processus qui ont VirtualBox dans leur sortie. L’un des problèmes est qu’un de ces processus semble exister pour garder les vivantes. Juste tuer le processus le plus élevé de VirtualBox. Si vous avez une image VirtualBox en cours d'exécution sans que vagrant ne le sache, il se peut que certains répertoires Vagrant aient été supprimés manuellement, ce qui signifie que Vagrant perd le suivi de l'instance.
Attention, votre Vagrantfile est pas le seul utilisé pour faire apparaître une boîte/instance Vagrant.
Quand vous obtenez ceci:
~/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$
En fait, vous utilisez non seulement le fichier Vagrantfile de ~/dev/vagrant, mais également celui de votre fichier .box de distribution "box" qui se trouve généralement ici:
~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile
Et si vous y jetez un coup d’œil, vous verrez qu’il contient de nombreux mappages default port:
$ 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)
Alors, continuez et éditez ce fichier pour supprimer le (s) port (s) de transfert en collision en cause:
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"
Par:
~/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
et faites attention aux autres inclusions de Vagrantfiles:
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
Et maintenant ça marche:
$ 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
...
J'espère que cela t'aides.
J'ai rencontré ce problème et il s'est avéré que RubyMine tenait toujours un port. J'ai découvert quelle application était en attente sur le port (31337 dans mon cas) en exécutant cette commande:
lsof -i | grep LISTEN
Sortie
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)
Notez également que (dans Vagrant 1.6.4 au moins) il y a le dossier ~/.vagrant.d/data/fp-leases
, avec des fichiers portant des noms tels que 8080
, 8081
etc. Effacer le contenu de ce dossier m'a aidé tout à l'heure.
Si vous utilisez Proxifier (ou une application similaire), essayez de le fermer en premier. C’est un problème que j’ai rencontré à cause de Proxifier sur OSX 10.9.
J'ai rencontré ce problème parce que VM essayait d'exécuter Postgres et que Postgres s'exécutait sur mon ordinateur local sur le port 5432.
Après vagrant resume
, j'ai eu l'erreur:
Vagrant ne peut pas transférer les ports spécifiés sur cette machine virtuelle, car ils entrerait en collision avec une autre application qui écoute déjà sur ces ports. Le port transféré vers 5432 est déjà utilisé sur la machine hôte.
Recherchez ce qui fonctionne sur le port 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)
Il s'avère que c'est un Postgres local, tuer ces processus m'a permis d'exécuter vagrant resume
avec succès.
Je l'ai corrigé de cette façon:
vagrant suspend
vagrant resume
Mon observation: Aucun processus n’exécutant sur le port 8000, le transfert de port ne fonctionnait donc pas. Correction: La réponse de Phil fournit une solution
~/.vagrant.d/boxes/
Le chemin ci-dessus contenait d'autres versions de fichiers vagrant répertoriant le port 8000. Une fois que je les ai toutes élaguées à l'aide de la commande ci-dessous, j'ai réussi à exécuter vagrant
vagrant box remove [name] --all