Help us understand the problem. What is going on with this article?

Vagrantでポート番号が衝突したときの対処法(Windows)

More than 3 years have passed since last update.

概要

Vagrantを起動する際にポート番号が他のアプリケーションが使っているためエラーになることがあります。
結論としては、Vagrantで別のポート番号を割り当てればよいのですが、
日ごろWindowsで開発していて、ポート番号を初めて調べたので備忘録のために手順を残します。

現象

vagrant up時に以下のようなエラーが表示される。

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 3333 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: 22, 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.

1. Windowsでportをどのアプリケーションが使用しているか調査。

// Windowsコマンドプロンプトを起動してnetstatコマンドで調査
> netstat -nao
TCP         127.0.0.1:3333         0.0.0.0:0              LISTENING       XXX // <-PID
...

2. WindowsタスクマネージャでPID XXXのアプリケーションを調べる。

[タスクマネージャ起動]->[詳細]で調べる

3. Vagrantのポート番号を変更する。

Vagrantfileを開き、以下のような記述があるところを修正すれば良いです。

xxxx.vm.network :forwarded_port, guest: 22, host: 3333, id: "ssh", auto_correct: false

しかし、何番にするのがベストなのか、気になったので調べました。
https://ja.wikipedia.org/wiki/TCPやUDPにおけるポート番号の一覧

49151番までは登録済みポート番号とのことで、一見すると49152番以降だと安全そうですが、
49152番以降はOSのエフェメラルポートとして自動的に割り当てられる可能性があるようです。(OSにもよるのでしょうが。)
そうなると逆にバッティングしそうなので、何か別のポートがいいかもしれません。

3333が既に競合しているというだけなので、2223とかにして様子を見ようかな…。

2017/04/06 追記
auto_correctという機能があるらしく、ポート番号が重複した場合に自動的に別のポートを割り当てるようです。

xxxx.vm.network :forwarded_port, guest: 22, host: 3333, id: "ssh", auto_correct: true

例えばポート番号3333で2つのvagrantを起動すると、以下のように自動的に2200番を割り当てます。

Bringing machine 'xxx' up with 'virtualbox' provider...
==> api: Checking if box 'hogehogehoge' is up to date...
==> api: Fixed port collision for 22 => 3333. Now on port 2200.
==> api: Clearing any previously set network interfaces...
==> api: Preparing network interfaces based on configuration...
    api: Adapter 1: nat
    api: Adapter 2: hostonly
==> api: Forwarding ports...
    api: 22 (guest) => 2200 (host) (adapter 1)
    api: 80 (guest) => 8808 (host) (adapter 1)
    api: 443 (guest) => 14438 (host) (adapter 1)
    api: 8000 (guest) => 18000 (host) (adapter 1)
    api: 3306 (guest) => 23306 (host) (adapter 1)
==> api: Running 'pre-boot' VM customizations...
...

まとめ

  • Windowsでポート番号調べるときにはnetstat -naoを使う。
  • エフェメラルポートというものがある。
  • ポート番号には絶対に衝突しないという選択肢はなさそう。
  • auto_correct: trueにすると、ポート番号が衝突した場合に自動的に別のポートを割り当てることができる。

2017/04/06 追記
※指摘を受けて修正しました。フィードバックありがとうございます。

nouka
WEBデザイナーからエンジニアに転向し、現在はリードエンジニア的な立場で働いています。 好きな本:「コードコンプリート」「リーダブルコード」「レガシーコード改善ガイド」「JavaScript: The Good Parts」「メンタルブロックバスター」
https://www.wantedly.com/users/18366823
ozvision
購買プラットフォーム「ハピタス」を開発・運営するベンチャー企業
https://www.oz-vision.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away