🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

1回答

2050閲覧

vagrantで一つの環境に、二つ目のサーバーを立ち上げる時のipアドレスの割当がうまくいきません

kohekoh

総合スコア140

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

0グッド

0クリップ

投稿2019/12/01 07:30

タイトルの表現があってるか微妙ですが、回答していただけると幸いです。

https://dotinstall.com/lessons/basic_localdev_mac_v2/38506
を参考に、vagrantでサーバ構築を行いました

以前、サーバーを構築しており、もう一つ別のサーバーが欲しいと思い
別のディレクトリを作成し、手順通りに構築をしました。

しかし、ipアドレスが割り当てられません。

もともとのサーバーには192.168.33.10のipアドレスを割り当てており、
うまくいっています。

今回立ち上げたサーバーに
192.168.33.11
を割り当てるようにしているのですが、適応されていない様です。

ちなみに上記サイトであるように
sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.11"/config.vm.network "private_network", ip: "192.168.33.11"/' Vagrantfile
このようにして、ipの割り当てをしていたのですが、うまく適応されていなかったので、
Vagrantfileを直接書き換え、ipアドレスが変わっている様子を確認しましたが、実際には
そのipをつかってもアクセスできないような状況です。

理解不足で、説明がうまくいっていない部分もあるのですが、
ご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらく、VagrantデフォルトのNATネットワーク構成になっているものと思われます。
その状況下では、VMはそれぞれ独自に"NAT用の内部ネットワーク"を構成し、独自にNATを用いて外部接続します。
これは、VMごとに作成されるので基本的に相互通信ができません。

Oracle VM Virtual Boxと、Vagrantの仕様上、そういった状況下でVM同士が通信するには、私の手元で実績がある範囲だと2種類の方法があります。

  1. Oracle VM Virtual Boxに内部ネットワークを作成し、VMをそれに接続する

  この場合、Virtual Boxでは、"ファイル"メニュー→"環境設定"→"ネットワーク"の中に新規にネットワークを定義し、それをVagrantファイルの中でVMの接続先ネットワークとして記述してやる必要があります。複数のVagrantファイルの中に接続先の内部ネットワークを記述してやることで、VagrantファイルをまたいでVM同士が通信できます。この方法では、内部ネットワークとなり、Vagrant/VirtualBoxが走っているPCの外部からVMへの通信は遮断されるので、こちらの仮想マシンのネットワークインターフェースを用いた、外部からのVMへの通信は、基本的にできません。

  1. 一つのVagrantファイルの中で、VMを複数定義し、同一の"NAT用内部ネットワーク"にVMを接続する

  この方法の方が手軽ですが、Network設定はVagrantファイルをまたげないという仕様となっていることは理解しておく必要があります。この方法では、NAT接続となるので、Vagrant/VirtualBoxが走っているPCの外部からVMへ接続する場合は、ポートフォワード設定が追加で必要なります。

正直に申し上げて、それ以外の接続方法もあるのですが、私個人では試していません。
いずれにせよ、Oracle VM Virtual BoxのNetwork構成方法について、ある程度の背景知識が必須です。

  • 相互通信をどのような形で行いたいのか。
  • 環境外部からVMへの接続は必須なのか。
  • VMへの外部からの通信は、様々なポートを使って接続したいのか、特定のポートへの通信だけ許可できればよいのか
  • VM同士の通信だけが行えれば良いのか。むしろ外部から通信は隠蔽したいのか。

などを要求通信仕様をある程度はっきりさせた上で、
Vagrantファイルをご開示いただけますか。

投稿2019/12/03 05:17

編集2019/12/03 05:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kohekoh

2019/12/10 14:54

返信が遅くなり申し訳ありません。 通信内容としては、 1.外部(ローカル環境)からvmへ接続したい ・vm上で作ったアプリをサーバーにのせて、ローカル側でアクセスしたいと考えています。 2.vm同士の接続は不要 ・以前作ったvmを消したくないだけなので、新たに作ったvmが外部と接続できればそれでよいです。 3.ポートは1つ ・複数ポートを使ってなにをするのかというところが理解できていないのですが、基本的にローカルからアクセスしたいだけなのでポートは1つあれば十分かと思っています。 Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "bento/centos-6.8" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.11" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end
退会済みユーザー

退会済みユーザー

2019/12/12 02:29 編集

コメントいただいた順より、回答に近い内容から順にご説明します。 ・以前作ったvmを消したくないだけなので、新たに作ったvmが外部と接続できればそれでよいです。 なるほど、そうなると、新たにDirectoryを切って、新たにBoxをVagrant initして、Vagrant upした今のやり方で大筋合っているように思えます。 この場合VM同士の通信は(何も設定しなければ)基本的にできません。 ・vm上で作ったアプリをサーバーにのせて、ローカル側でアクセスしたいと考えています。 => Virtual Box的には、内部ネットワーク、次点でNAT(デフォルト)がもっとも適切だと思います。 手軽さを考えるとデフォルトがいいのではないでしょうか。 3.ポートは1つ ・複数ポートを使ってなにをするのかというところが理解できていないのですが、基本的にローカルからアクセスしたいだけなのでポートは1つあれば十分かと思っています。 => portを複数使うような場合は、例えばWebアプリケーション等の場合、DBバックエンドとの通信ポートとHTTP通信ポートは分けます。これは、セキュリティの意味もありますが、現実には、トラブル発生時などの障害の切り分けがより楽になるから、です。 とはいえ、複数のポートを開ける場合も、基本的な1ポートの開放を複数回繰り返すだけですので、まずは狙ったポートを開けるところに絞ってお伝えします。 ==解決方法の提案== 別Directoryでvagrant init/upした場合、Virtual Box的には、それぞれが、別のNATネットワークアダプタとして作成されます。 この状況下では、NATネットワークは別に作成されるため、VMの192.168.33.11としても、そもそも通信不可能です。 なお、Vagrant Fileは文法的にはRubyのファイルなんですが、IPアドレスの設定が(Ruby的に)コメントアウトされたままなので、コメントアウトされたVMへの設定は反映されません。 (直前で説明したように、このコメントアウトを外しても多分通信できません) VM同士の通信が必要でない場合で、かつ、ホストOS側からの通信だけ許可すれば良いような場合は、NATアダプタにport forward するのが、もっとも手軽です。 この方法だと、(基本的にホストOS側のネットワーク設定の乗っ取りなどがなければ)ホストOS外からのVMへのアクセスは不可能です。 その場合は単に、 config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" の行のコメントを外して、転送したいポート番号を、、、って読めばわかると思いますが、 この設定だと、guestの80番ポートを、ホストOSの127.0.0.1の8080に転送するようになっているので、 いかようにでも好きなポートに設定してください。 なお、老婆心ですが、2222とか2202とか、VagrantのSSHのポートと似た番号は使わないほうが、混乱を避けられると思います。 老婆心ついでに、 適応と適用を混乱しておいでですが、 適応は、英語でadoptであり、状況になんらかの生物や主体が(自発的に)合わせるのに対し、 適用は、英語でapplyであり、意図して何らかの設定などを反映させる、 というニュアンスですので、 この言い間違いやtypoはできれば避けたほうが良いと思います。
kohekoh

2019/12/15 15:34

丁寧な説明ありがとうございます。 適応、適用についても理解しました。 vagrantfileを以下のように書き換えました。 config.vm.network "forwarded_port", guest: 80, host: 4040, host_ip: "127.0.0.1" この状態で、vagrant reload を実行しましたが 192.168.33.11 のipアドレスでアクセスすることができません
退会済みユーザー

退会済みユーザー

2019/12/16 01:14 編集

自ホスト(localhost)のIPアドレスに対しての設定をいれたことになるので、 webブラウザなどで、http://localhost:4040 telnetであれば、localhostのport4040にアクセスしてみてください。 見落としがちで割りとミスリードされてしまいそうなハマり場所かつ、重要な点ですが、 Virtual Box的にNATネットワークアダプタの場合、 ・ホストOSは、NATルーター兼DHCPサーバとして振る舞う ・ゲストOSは、ホストをNATゲートウェイを使い、DHCPクライアントとして振る舞う ・ホストOS(NATルータ)からIPアドレス直たたきで、直接ゲストOSにはアクセスできない  (↑これが今回アドレス直たたきでアクセスできない原因) ・ホストOSからゲストOSにアクセスできるとしたら、ポートフォワードだけ  (つまり特定の仮想マシンの特定のポートだけ、ゲスト側からアクセスできる) ・複数ゲストOSは、それぞれ別のPrivate Network属する。これはブロードキャストドメインレベル(L2レベル)で別のネットワーク。  (そのためゲストOS同士は、ネットワークアダプタの種別自体を変更しない限り、アドレスを変更しても通信できない) ・そして多分、以上のVirtual Boxの特性上、仮想マシンがNATネットワークアダプタの場合、そもそも仮想マシンのIPアドレスを変更する意味がない(1つのNATアダプタあたり、1つのネットワークで相互通信不可)からか、Vagrant的に、デフォルトの場合は、アドレスを変更するようにはVagrantファイルはかけない?ぽい。 ・もしアドレスを変更できるとすれば、Virtual BoxでNetworkを作ってやって(環境設定→ネットワーク)、そのネットワークに仮想マシンを接続させるような場合など。 別ディレクトリであれば、別の(デフォルトの場合NAT用の)Private Networkが作成されます。 この別のNATネットワークは、論理的に分割されているため、VM同士は通信できないようです。 (めっちゃ強引に、ホストOS側でnetshとかiptablesでルーティングとポートフォワードしてやればできると思いますが。)
kohekoh

2019/12/16 13:22

vagrant upができているなら アクセスできるはずですよね? アクセスできません…
退会済みユーザー

退会済みユーザー

2019/12/17 00:49

・仮想マシンのip aの結果 ・Virtual BoxのNICの設定画面(ip aで表示されたものからlocalhost分を除外したすべてのNIC分) ・編集後のVagrantfile の3つを拝見させていただけないでしょうか。
kohekoh

2019/12/23 12:38

返信が遅くなり申し訳ありません ・仮想マシンのip aの結果 [vagrant@localhost ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:40:17:62 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 inet6 fe80::a00:27ff:fe40:1762/64 scope link valid_lft forever preferred_lft forever ・Virtual BoxのNICの設定画面がどこから表示させれば良いかがわかりませんでした。 ・編集後のVagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "bento/centos-6.8" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access config.vm.network "forwarded_port", guest: 80, host: 4040, host_ip: "192.168.33.11" # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.11" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end
kohekoh

2019/12/23 14:47

うーんわからないことだらけです virtualboxの設定をみてみると ipアドレスが正しく割り振られている以前設定した仮想マシンは ネットワーク設定にアダプタが2つ(NAT、ホストオンリーアダプタ)あります。 しかし、今回設定した仮想マシンは1つしかアダプタの設定がありません(NATのみ) これが関係しているんですかねえ
退会済みユーザー

退会済みユーザー

2019/12/24 00:18

[Vagrant/Virtual BoxのNATアダプタについて] NATって何か、については詳しく触れませんが、基本的には、NATアダプタの場合、IPアドレスは自動払い出し(DHCP)になるのが、Virtual Boxの慣例だと思います。 これがわかっていると、 config.vm.network "forwarded_port", guest: 80, host: 4040, host_ip: "192.168.33.11" の意味は、 ・ゲストVMのNICに対して(ゲストNICのIPアドレスはDHCPで割り当て済み)、 ・ゲストVMの当該NICのIPアドレスの80番に対して ・ホスト実機のIPアドレス、"192.168.33.11"の ・4040番に来たホスト実機側への接続をゲストVMに転送する。 というニュアンスになります。 素朴に疑問なんですけれど、ホスト実機は、"192.168.33.11"のアドレスを持っているんでしょうか。 実機側は普通、 ・localhost(127.0.0.1 and/or ::1) ・NICの数のぶんのIPアドレス のアドレスを持ちますが、この中に"192.168.33.11"はありますか? なければ、そもそも転送元のIPアドレスが無い、ってことになります。 もしホスト実機側に"192.168.33.11"がなければ、 下記のように、単に config.vm.network "forwarded_port", guest: 80, host: 4040 と書いてやると、 config.vm.network "forwarded_port", guest: 80, host: 4040, host_ip: "127.0.0.1" と書いたことと同じになるので、 localhost:4040でアクセス可能になるはずです。 もしホスト側に"192.168.33.11"があれば、 192.168.33.11:4040 でアクセスしてください。 また、そしてもし、ホスト側に"192.168.33.11"がなければ、それはそもそも経路が見つけられず、接続できないことになります。 あるいは、別のホストが"192.168.33.11"を持っていればそっちに接続にいってしまうことになります。 [VagrantfileのNICの書き方について] (この仕様は本当は個人的には好みではないのですが) Vagrantファイルにおいて、 VMの複数NICの設定方法は、 config.vm.network "private_network", ip: "192.168.50.4" config.vm.network "private_network", ip: "192.168.50.5" config.vm.network "private_network", ip: "192.168.50.6" config.vm.network "private_network", ip: "192.168.50.7" の様に、単にvm.networkを繰り返すようになっています。 これが、 『あたかも単一のNICに対する設定を行うような見栄えになる』ために、 『実際は複数のNICを作成する』という動作との意味的な乖離があるように(個人的に)感じます。 ですので、以前のVMが、どのようなNIC構成になっていたかは、わかりませんが、 何らかの形で、複数のvm.network行があって、NICが複数作成され かつ、VMの接続先のNetworkが(ブリッジネットワークなど)実際に、または仮想で存在し、 たまたま接続がうまくいっただけなように思えてきますね。 もし今回も複数のネットワークを作りたいのであれば別ですが、今回はport forwardだけでよいという話ですので、いたずらにvm.network行を増やすことは無いと思います。 (Q)Virtual BoxのNICの設定画面がどこから表示させれば良いかがわかりませんでした。 (A)こいつは、Virtual BoxのGUI画面で、仮想マシンして、歯車アイコンになっている"設定(S)"ボタンから、"ネットワーク"ペインを開くと、タブブラウザで表示されます。
kohekoh

2019/12/24 15:43

うーん ホストのほうに設定がされていない感じがしますね かといって、 config.vm.network "forwarded_port", guest: 80, host: 4040 としたところで、localhost:4040で接続はできません
退会済みユーザー

退会済みユーザー

2019/12/25 00:34 編集

それ、guestのfirewalldが有効なママだったりとかしませんか。。 systemctl stop firewalldとか。
kohekoh

2019/12/26 12:47

本当にありがとうございます 壁がおおすぎて、心がおれそうです systemctlが使えないんですよね パスが通っていないのかなんなのか…
退会済みユーザー

退会済みユーザー

2019/12/26 23:56

sudoできてないんじゃないかな。 systemctlコマンド単発で実行したときのログを見せていただけますか? 多分ですが、 sudo systemctl stop firewalld 多分、デフォルトのパスワードはvagrantです。
kohekoh

2019/12/27 12:34

[vagrant@localhost ~]$ systemctl status firewalld -bash: systemctl: コマンドが見つかりません こういうことなんですよね…
退会済みユーザー

退会済みユーザー

2019/12/29 01:37

sudoつけて実行してください。 $ sudo systemctl stop firewalld ってなるはずです。 パスワード聞かれたら、vagrant プロンプトが戻ってくればfirewalldの停止に成功しているはず。
kohekoh

2019/12/29 01:49

[vagrant@localhost ~]$ sudo systemctl status firewalld sudo: systemctl: コマンドが見つかりません こういうことなんです…
退会済みユーザー

退会済みユーザー

2019/12/30 21:45 編集

sudo service iptables stop;sudo service ipv6tables stop で、止められるはずです。 確かにpathが通ってないですね。 CentOSの6.8でしたか。。。CentOS 6系はサポートはされるもの2020年11月30日 でサポートが切れるので、CentOS 7か8へ移行を考えたほうがいいでしょう。ノウハウの多くが無駄になります。 本質を理解するために、知っていて損にはなりませんが、単なるノウハウレベルの知識ですと、投資対効果がどんどん今後下がります。 CentOS 6系では7以降や、他の最近のディストリビューションのようなsystemdではなく、initが使われています。 (initというのは、古典的なOSの起動シーケンスプログラムです、最近のディストリビューションでは一般的にはsystemdが使われます)
kohekoh

2019/12/30 21:50

なるほど… 割と6と7で相違点が多いみたいなので、そこらへんも見つつ考える感じですかね ちなみに7と8だと、こっちがいいとかってあるんですか?? 一旦これで確認してみました [vagrant@localhost /]$ sudo /etc/rc.d/init.d/iptables status iptables: ファイアウォールが稼働していません。 稼働してないのか…ってなったんですが 一応 sudo service iptables stop;sudo service iptables stop を実行すると http://localhost:4040 で、apacheのテストページに飛ぶことができました!!
退会済みユーザー

退会済みユーザー

2019/12/31 04:20 編集

よかった!!! ちょっと6は久しく触ってないので、なぜstatusで稼働していないメッセージが出たかは、ログ読んでみないとわかりません。。ごめんなさい。 6と7以降では相当違います。 個人的な体感として一番大きなのは、起動周りのinitからsystemdへの変更ですが、それ以外にも、iptablesから、firewalldへの変更や、個人的実感として、安定性そのものの向上も割と影響でかいです。 8はリリースされたばかりですが、ブラッシュアップされた7と言う感じで、その意味では、甲乙つけ難いですが、今から学ぶなら、8でしょうか。。 ただ、今回みたいな茨の道は、稀だとおもいますよ。 7との互換性が割りと高いので、7の記事がかなり参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問