kakts-log

programming について調べたことを整理していきます

Vagrant VM内にたてたmongodにhost OSから接続できるようにする

概要

Vagrant VM内でmongodを立てて、host OSからアクセスできるようにする方法をまとめます。 docker containerで以前mongo用コンテナの建て方についてまとめたのですが、 仕事でVagrantVMを立て、その中でmongodを立てる機会があり、
今回はその時に行った手順をまとめます。

vagrant 1.8.1
MongoDB server version: 3.4.7

やりたいこと

Vagrant で立ち上げたVM内に、mongoDB 3.4系 (本稿では3.4.7 )のmongodプロセスを立ち上げる。 VMのプライベートネットワーク内のipを192.168.33.10と設定し、host(MacOS)のポート27017を、VM内のmongodが使用しているポート27017にポートフォワーディングさせる。

hostのmongoシェルから mongo –host 192.168.33.10とコマンドを打つと、VM内のmongodにアクセスできるようにする

Vagrant VMを立ち上げる

下準備として、centOS用のboxを追加する作業がありますが、今回は主旨とずれるため説明しません。 centOSのboxは、下記のところから、6系か7系のものを選んで vagrant box add {url} とすればboxが追加されるかと思います A list of base boxes for Vagrant - Vagrantbox.es

Vagrantfileの記述

そして、Vagrantで起動するVMの設定ファイルであるVagrantfileに、プライベートネットワークのipや、ポートフォワーディング設定を記述していきます。 今回はすでに用意したcentOSのboxを使用します。 box名はここではcentosとしています。

$ vagrant box list
centos (virtualbox, 0)

今回はVagrantfileの記述はほんとにシンプルで、最小限の設定にします。 プライベートネットワークIPと、ポートフォワーディングの設定のみ行います。 hostの27017ポートをguest(VM)の27017ポートに紐付けます

Vagrant.configure(2) do |config|
  config.vm.box = "centos"

  # VMのプライベートネットワークのIPを設定する
  config.vm.network "private_network", ip: "192.168.33.10" 
  # ポートフォワーディングの設定をする
  config.vm.network "forwarded_port", host: 27017, guest: 27017
end

````
上記のconfig.vmのパラメータは色々あり、ここでVMの設定を行うことができます。  
設定できるパラメータはドキュメントを参照ください。
[https://www.vagrantup.com/docs/vagrantfile/machine_settings.html:embed:cite]


今回つかう config.vm.networkの設定はこちらです
[https://www.vagrantup.com/docs/networking/basic_usage.html:embed:cite]

#### vmを立ち上げる
Vagrantfileの記述ができたのでvmを立ち上げます。

Vagrantfileのある階層でvagrant upを実行してください

Vagrantfileの内容をもとにVMを立ち上げる $vagrant up

Vagrant VMでポートフォワーディングされているポートを確認 $ vagrant port The forwarded ports for the machine are listed below. Please note that these values may differ from values configured in the Vagrantfile if the provider supports automatic port collision detection and resolution.

22 (guest) => 2222 (host)

27017 (guest) => 27017 (host)

vagrant up して立ち上げ、 vagrant portで紐付けられたポートを確認できます。 

これでVMが立ち上がりました。
あとはvagrant ssh してVMインスタンス内で作業します。
#### centOS内でのmongo3.4系のインストールとmongod起動
今回はmongoのインストールは主旨と外れるのでここでは詳細な手順をスキップします。
本家のドキュメントに書いてある通りにおこなってyum でインストールできるようになります。
[https://docs.mongodb.com/v3.0/tutorial/install-mongodb-on-red-hat/#install-mongodb:title]

#### mongodの起動設定の編集
mongo3.4系がインストールできたらmongodを起動する前に、VM外からmongodへアクセスさせるための設定を入れます。
centOSでmongoDBをインストールした際、デフォルトで/etc/mongod.conf にmongodの設定ファイルが作成されます。  
ここで、mongodへの接続を待ち受けるipの設定を行う事ができます。

net.bindIp項目でその設定を行う必要があり、初期設定では下記の用になっています。

network interfaces

net: port: 27017 bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.

mongod起動時のportは 27017、接続を待ち受けるipは127.0.0.1つまりVM内部のみからとなっております。  

bindIpのドキュメントを抜粋すると下記のとおりです。
> The IP address that mongos or mongod binds to in order to listen for connections from applications. You may attach mongos or mongod to any interface. When attaching mongos or mongod to a publicly accessible interface, ensure that you have implemented proper authentication and firewall restrictions to protect the integrity of your database.
> 
> To bind to multiple IP addresses, enter a list of comma separated values.
[https://docs.mongodb.com/manual/reference/configuration-options/#net-options]


今回は、VMに設定したプライベートネットワークのIP 192.168.33.10 に対して接続も受け付けるため、 bindIpにカンマ区切りで192.168.33.10を追記します。

network interfaces

net: port: 27017 bindIp: 127.0.0.1,192.168.33.10 # カンマ区切りで192.168.33.10追加

これでmongodの設定はできたので、mongodを起動します。

mongod start

$sudo service mongod start Redirecting to /bin/systemctl stop mongod.service

mongodのプロセスが立っていることを確認する

$ps aux | grep mongo mongod 3451 7.6 8.1 972640 38172 ? Sl 15:57 0:00 /usr/bin/mongod -f /etc/mongod.conf

これでmongodを起動できました。

#### vm内のファイアウォールの設定を変更する
現時点では、まだVM外部から27017ポートへの接続はできません。 ファイアウォールの設定を変更し、VM内の27017ポートに対して、VM外からtcpでアクセスできるようにします。

firewall-cmdを使うのが非常に簡単なので、今回はfirewall-cmdを使った方法を説明します。

port27017に対して、tcpを使った外部からの接続を許可する

sudo firewall-cmd –zone=public –add-port=27017/tcp –permanent

↑で設定を変更したのでfirewall-cmdをリロードする

sudo firewall-cmd –reload

これで27017ポートの外部公開設定が完了しました。

#### ホストOSからVM内のmongodに接続する
VM、mongodの設定が完了したのであとはホストOSのターミナルから接続するだけです。  

$ mongo –host 192.168.33.10 MongoDB shell version v3.4.4 connecting to: mongodb://192.168.33.10:27017/ MongoDB server version: 3.4.7 Server has startup warnings: 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] WARNING: Access control is not enabled for the database. 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] Read and write access to data and configuration is unrestricted. 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’. 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten] We suggest setting it to ‘never’ 2017-09-06T16:04:00.953+0000 I CONTROL [initandlisten]

show dbs admin 0.000GB local 0.000GB

これで接続できない場合は、mongodの設定ファイルを確認し、mongod再起動したり、あとはfirewall-cmdでポートの公開設定がされているかを確認してください。 
firewallまわりで手こずるかもしれませんが、一度理解するとあとは簡単に設定できるかと思います。  


## まとめ
今回はVagrant で立ち上げたcentOS  VM内のmongodを、ホストOS(MacOS) から接続できるようにしました。
コレができるとVagrantで簡単に検証用のmongo環境が作れて、mongo関連の検証・動作確認が捗るかと思います。