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ボックスをリストする方法はありますか?
ありがとう、ケビン
メッセージが示すように、ポートはホストボックスと衝突します。ホストマシンでポートを他の値に変更するだけです。だから私はのためのエラーが発生している場合
config.vm.forward_port 80, 1234
それから私はそれを
config.vm.forward_port 80, 5656
ホストマシンでは1234が使用される可能性があるため。
実際に任意のマシンのポートを検査するには、そのOSのtcpview
ユーティリティを使用し、どのポートがどこで使用されているかを把握します。
次のコマンドを実行することにより、マシン上で実行されている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
実行中のVMが表示されない場合、競合は(Vagrantが知っている)Vagrantボックスではありません。次に行うことは、VirtualBox UIを起動し、実行中のインスタンスがあるかどうかを確認することです。 UIを実行したくない場合は、次のことができます。
ps -ef |grep VBox
VirtualBoxインスタンスを実行している場合、それらをその出力に含める必要があります。出力にVirtualBoxが含まれるプロセスを強制終了できます。 1つの問題は、それらのプロセスの1つがキープアライブを実行するために存在するように見えることです。最高のVirtualBoxプロセスを終了するだけです。 VirtualBoxイメージを実行しているが、vagrantが認識していない場合、Vagrantディレクトリの一部が手動で削除されている可能性があります。つまり、Vagrantはインスタンスの追跡を失います。
Vagrantfileは唯一のものではありません Vagrant box/instanceを起動するときに使用されます。
これを取得するとき:
~/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だけでなく、通常は次の場所にある「box」配布.boxファイルのVagrantfileも使用しています。
~/.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
...
お役に立てれば。
私はこの問題にぶつかり、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)
また、(少なくともVagrant 1.6.4には)~/.vagrant.d/data/fp-leases
というフォルダーがあり、8080
、8081
などの名前のファイルがあることに注意してください。
Proxifier(または同様のアプリ)を使用する場合は、最初に閉じてみてください。これは、OSX 10.9のProxifierが原因で発生した問題です。
逃げ道:
この問題が発生したのは、Postgresを実行しようとしていたVMがあり、ローカルマシンでポート5432でPostgresを実行していたためです。
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
を正常に実行できました。
このように修正しました:
vagrant suspend
vagrant resume
Vagrant.configure( "2")do | config |
config.vm.network "forwarded_port"、ゲスト:80、ホスト:8080、
auto_correct: true
終わり
最後の:auto_correctパラメーターをtrueに設定すると、Vagrantに衝突を自動修正するよう指示されます。 Vagrantのアップ中またはVagrantのリロード中に、Vagrantは衝突の検出と行われた自動修正に関する情報を出力するため、それに応じて注意を払い、行動することができます。
https://www.vagrantup.com/docs/networking/forwarded_ports.html
私の観察:ポート8000で実行されているプロセスがないため、基本的にポート転送は機能しませんでした。修正:Philの答えが解決策を提供した
~/.vagrant.d/boxes/
上記のパスには、ポート8000をリストした他のバージョンのvagrantファイルがありました。以下のコマンドを使用してすべてを整理すると、vagrantを正常に実行できました。
vagrant box remove [name] --all