web-dev-qa-db-ja.com

「VagrantはこのVMで指定されたポートを転送できません」メッセージをデバッグする方法

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ボックスをリストする方法はありますか?

ありがとう、ケビン

40
Kevin Burke

メッセージが示すように、ポートはホストボックスと衝突します。ホストマシンでポートを他の値に変更するだけです。だから私はのためのエラーが発生している場合

config.vm.forward_port 80, 1234

それから私はそれを

config.vm.forward_port 80, 5656

ホストマシンでは1234が使用される可能性があるため。

実際に任意のマシンのポートを検査するには、そのOSのtcpviewユーティリティを使用し、どのポートがどこで使用されているかを把握します。

13
Vishal Biyani

次のコマンドを実行することにより、マシン上で実行されている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はインスタンスの追跡を失います。

60
bikeonastick

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
...

お役に立てれば。

19
Phil L.

私はこの問題にぶつかり、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)
9

また、(少なくともVagrant 1.6.4には)~/.vagrant.d/data/fp-leasesというフォルダーがあり、80808081などの名前のファイルがあることに注意してください。

6
hijarian

Proxifier(または同様のアプリ)を使用する場合は、最初に閉じてみてください。これは、OSX 10.9のProxifierが原因で発生した問題です。

2
Dustin Cowles

逃げ道:

  1. $浮浪者の一時停止
  2. $浮浪者の履歴書
0

この問題が発生したのは、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を正常に実行できました。

0
inostia

このように修正しました:

  1. vagrant suspend
  2. RubyMine IDEのプロジェクトを閉じる
  3. vagrant resume
  4. RubyMine IDEで最近開く
0
Is Ma

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

0
Seyedan

私の観察:ポート8000​​で実行されているプロセスがないため、基本的にポート転送は機能しませんでした。修正:Philの答えが解決策を提供した

~/.vagrant.d/boxes/ 

上記のパスには、ポート8000​​をリストした他のバージョンのvagrantファイルがありました。以下のコマンドを使用してすべてを整理すると、vagrantを正常に実行できました。

vagrant box remove [name] --all
0
VeeKay