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

Vagrantが自動設定したポートフォワードを一覧表示するプラグイン「vagrant-fwdports」

More than 5 years have passed since last update.

目的

Macなどでvagrant sshしているとあまり気にしないかもしれませんが、
Vagrantで複数のVMを起動していたりすると、自動設定しているポートフォワードって
ゲストの何番がホストの何番になってるんだっけ?ということがあります。

そんなちょっとした不便を解決するため、「vagrant-fwdport」というVagrantのプラグインを作りました。

vagrant-fwdportsをインストールすると、vagrant fwdportsというコマンドを実行することで、
現在のVagrant VMがどのようなポートフォワード設定になっているかをコンソールに表示します。

なお、このプラグインはProviderがVirtualBoxのVMにのみ対応しています。
ちなみに、私が検証した環境はVagrant 1.4.1、VirtualBOX 4.3.6です。

インストール

2014/1/16追記

Rubygems.orgにpushしたので、現在はvagrant plugin install vagrant-fwdportsでインストール可能ですが、以下のソースから導入する方法も残しておきます。


READMEにも書いてありますが、
つたない英語なので日本語で書き直します。

まず、GitHubからクローンします。

git clone https://github.com/ariarijp/vagrant-fwdports.git

クローンが終わったら、vagrant-fwdportsディレクトリに移動します。

cd vagrant-fwdports

次に、Gemをビルドします。

rake build

最後に、vagrant-fwdportsをインストールします。
[version]はビルドされたgemファイルにあわせて修正してください。

vagrant plugin install ./pkg/vagrant-fwdports-[version].gem

使い方

VMを起動した状態で、Vagrantfileがあるディレクトリーに移動し、以下のコマンドを実行します。

vagrant fwdports

単一のVMであれば以下のように表示されます。

+--------------------------------------+--------------+---------------------+------------+-----------+
| machine.id                           | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | ssh                 | 22         | 2222      |
+--------------------------------------+--------------+---------------------+------------+-----------+

マルチVMであれば以下のように表示されます。

+--------------------------------------+--------------+---------------------+------------+-----------+
| machine.id                           | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| aa0d0f4c-80bd-44f3-80f4-b2a6febecc8f | web          | ssh                 | 22         | 2222      |
| c2ea05d3-f9ba-4b60-b8f9-6829b0c88123 | db           | ssh                 | 22         | 2200      |
+--------------------------------------+--------------+---------------------+------------+-----------+

単一のVMで以下のような設定をVagrantfileに書いた場合の出力例です。

Vagrantfile
config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 3306, host: 13306
config.vm.network :forwarded_port, guest: 5678, host: 15678
config.vm.network :forwarded_port, guest: 3000, host: 13000
+--------------------------------------+--------------+---------------------+------------+-----------+
| machine.id                           | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | ssh                 | 22         | 2222      |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | tcp13000            | 3000       | 13000     |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | tcp13306            | 3306       | 13306     |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | tcp15678            | 5678       | 15678     |
| 7f4b1865-c6e9-45e7-8044-2c6a080440ee | default      | tcp8080             | 80         | 8080      |
+--------------------------------------+--------------+---------------------+------------+-----------+

極端な例ですが、Web3台、DB2台で8080ポート、3306ポートが衝突してしまうような設定の場合はこのようになります。

Vagrantfile
config.vm.define "web01" do |web|
  web.vm.box = "base"
  web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "web02" do |web|
  web.vm.box = "base"
  web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "web03" do |web|
  web.vm.box = "base"
  web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true
end

config.vm.define "db01" do |db|
  db.vm.box = "base"
  db.vm.network :forwarded_port, guest: 3306, host: 3306, auto_correct: true
end

config.vm.define "db02" do |db|
  db.vm.box = "base"
  db.vm.network :forwarded_port, guest: 3306, host: 3306, auto_correct: true
end
+--------------------------------------+--------------+---------------------+------------+-----------+
| machine.id                           | machine.name | forwarded_port_name | guest_port | host_port |
+--------------------------------------+--------------+---------------------+------------+-----------+
| fb40528e-ebef-4361-bce9-0b430a8b346b | web01        | ssh                 | 22         | 2222      |
| fb40528e-ebef-4361-bce9-0b430a8b346b | web01        | tcp8080             | 80         | 8080      |
| 70cfa478-9590-4f8e-a1f5-128299ec0e99 | web02        | ssh                 | 22         | 2200      |
| 70cfa478-9590-4f8e-a1f5-128299ec0e99 | web02        | tcp8080             | 80         | 2201      |
| 2af2a3b8-8a44-4571-9ecd-e7a92d3f1b43 | web03        | ssh                 | 22         | 2202      |
| 2af2a3b8-8a44-4571-9ecd-e7a92d3f1b43 | web03        | tcp8080             | 80         | 2203      |
| f973f02f-1b7d-4e8d-8e46-9ef5691a0e6a | db01         | ssh                 | 22         | 2204      |
| f973f02f-1b7d-4e8d-8e46-9ef5691a0e6a | db01         | tcp3306             | 3306       | 3306      |
| efc6599d-8320-4e80-8650-76607ec9460c | db02         | ssh                 | 22         | 2205      |
| efc6599d-8320-4e80-8650-76607ec9460c | db02         | tcp3306             | 3306       | 2206      |
+--------------------------------------+--------------+---------------------+------------+-----------+

まとめ

なるべくポートが衝突しないようにホスト側のポート番号を割り振っても、8080番などは奪い合いになることが多くなります。
衝突したポートを自動で振り替えてくれるのは好きなVagrantの機能のひとつなので、こんなツールと一緒にうまく付き合えるといいと思ってます。

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした