vagrantのネットワークについて

  • 471
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Vagrantfileの実例を交えつつvagrantのネットワークについてまとめます。
ここに記載の内容はこのブログにほぼ全て記載されています。

スクリーンショット 2014-08-11 22.43.18.png

言葉 意味
ホスト vagrantコマンドを実行するホスト
ゲスト vagrantコマンドで作成されたVM
内部ネットワーク vagrant内のネットワーク
外部ネットワーク ホスト外のネットワーク

Vagrantfileのnode1はゲスト1、node2はゲスト2。

ホストオンリーアダプタ

仮想ネットワークインタフェースを作成し、ホストとゲストの間での閉じたネットワークを形成。ゲストとホスト間のみ通信可能。ゲスト同士の通信はできない。

スクリーンショット 2014-08-11 22.51.28.png

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos65-x86_64-20140116"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :node1 do |node|
    node.vm.box = "centos65-x86_64-20140116"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos65-x86_64-20140116"
  end
end

ifconfig抜粋(ゲスト1)

eth0      Link encap:Ethernet  HWaddr 08:00:27:4F:B8:06
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2429 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1469 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:208257 (203.3 KiB)  TX bytes:173198 (169.1 KiB)

vagrant ssh node1vagrant ssh node2 でそれぞれのゲストにアクセス可能。
eth0のネットワークを利用。それぞれのゲストで全て同じアドレス。

プライベートネットワーク

内部ネットワークを利用してホストとゲスト、ゲスト間同士の通信が可能。

スクリーンショット 2014-08-11 23.25.11.png

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos65-x86_64-20140116"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :node1 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :private_network, ip:"192.168.33.11"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :private_network, ip:"192.168.33.12"
  end
end

ifconfig抜粋(ゲスト1)

eth0      Link encap:Ethernet  HWaddr 08:00:27:4F:B8:06
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2429 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1469 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:208257 (203.3 KiB)  TX bytes:173198 (169.1 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:22:92:33
          inet addr:192.168.33.11  Bcast:192.168.33.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4314 (4.2 KiB)  TX bytes:5534 (5.4 KiB)

ホストオンリーアダプタ以外に、内部ネットワーク経由でホストからnodeXに ssh -l vagrant 192.168.33.1X で接続可能。node1, node2の間も接続可能。
外部ネットワークからはアクセス出来ない。

仮想内部ネットワーク

ゲストとホストはホストオンリーアダプタでのみアクセス可能。
内部ネットワークはゲスト同士は接続できるが、ホストからゲストへはアクセス出来ない。

スクリーンショット 2014-08-11 23.20.50.png

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos65-x86_64-20140116"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :node1 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :private_network, ip:"192.168.33.11", virtualbox__intnet: "test_net"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :private_network, ip:"192.168.33.12", virtualbox__intnet: "test_net"
  end

end

ホストからゲストへは vagrant ssh nodeX でアクセス可能。ホストからゲストへ ssh -l vagrant 192.168.33.1X でアクセス出来ない。ゲスト間の閉じたネットワーク(仮想内部ネットワーク)同士のみアクセス可能。
virtualbox__intnet を指定することでゲスト同士の仮想内部ネットワークを構築できる。値 test_net は任意の文字列でよい。

ポートフォワーディング

ホストの特定のポートへのアクセスをゲストへ転送する。外部ネットワークからアクセス可能。

スクリーンショット 2014-08-12 0.04.01.png

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos65-x86_64-20140116"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :node1 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :forwarded_port, guest:22, host:2001, id:"ssh"
    node.vm.network :forwarded_port, guest:80, host:8080, id:"http"
    node.vm.network :private_network, ip:"192.168.33.11"
  end

end

ホストオンリーアダプタ以外に、ホストから ssh -l vagrant -p 2001 127.0.0.1 もしくは ssh -l vagrant -p 22 192.168.33.11 でsshアクセス可能。
ホストから http://127.0.0.1:8080 もしくは http://192.168.33.11:80 でhttpアクセス可能。
実際ホスト側で lsof -i :2001lsof -i :8080 を実行するとLISTEN状態になっている。

パブリックネットワーク

外部ネットワークから直接ゲストにアクセス可能。
ホストはiPhoneのテザリングを利用してネットに接続しているものとする。

スクリーンショット 2014-08-12 0.24.02.png

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos65-x86_64-20140116"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :node1 do |node|
    node.vm.box = "centos65-x86_64-20140116"
    node.vm.network :public_network
  end
end

vagrant up を実行し、どのインタフェースを使うか選択する。(この例ではWi-Fi (AirPort))
IPアドレスはDHCPで自動で割り当てられるのでVM起動後ホストオンリーアダプタでアクセスして
アドレスを確認する。ゲストでhttpdが動いている場合、アイフォンのWebブラウザにゲストのIPアドレスを入力すると、ブラウザにゲストのWebページが表示される。

IPアドレスを指定して起動することもできるが、ゲスト側ではちゃんと設定できているように見えてもホストや外部ネットワークからは接続できなかった。IPを指定せず、DHCPで自動的に割り当てられたIPアドレスだとアクセスできた。

リンク