dockerでVM上にnginx-Nodejs-Mongodbの開発用の雛形を作ってみた

 

nginx-nodejs-mongodbの開発環境（※メインはNode部分）がvagrant upだけで構築できるように
VM上にDockerで作成してみました。
（今回docker-composeは使用していません）

***追記：***
こちら下記で作り直しました。
[Docker ComposeでVM上にNodejsの開発(nginx-Nodejs-Mongodb)用の雛形を作成する](http://qiita.com/Manjiii/items/d8c2f53c9f1a964936a6)


#環境
HOST : MacOS 10.12.6 (Sierra)
Vagrant 1.9.7

#下準備

[MacでVagrant上にdocker環境を構築する](http://qiita.com/Manjiii/items/5546cde1ecf532cf2082#_reference-f64df15db8c48cae858a)
上記手順のようにVagrantがインストールされていることが前提となります。
※DockerはVM上に新たに作成する時に入るので特に作業は必要ありません。

#ソース

こちらに一式入れてあります。
https://github.com/manjiii/Vagrant-samples/tree/master/Skeleton-nginx-nodejs-mongodb
git cloneかダウンロードで任意のディレクトリにコピーして下さい。

#ディレクトリ構成
ホスト上のディレクトリ構成は以下になります。

```
Skeleton-nginx-nodejs-mongodb
│
├── Vagrantfile
├── backup                #<- バックアップ(＆インポート)用ディレクトリ（用意してあるのはMongoのデータのみ）
│   ├── mongo
│   └── set_ssh.sh
├── dockers               # <- 各Docker用のファイル
│   ├── mongodb
│   ├── nginx
│   └── node
├── settings
│   └── localsetting.yaml # <- Vagrantfile用の個別の設定ファイル
└── shell                 # <- Vagrant用の個別の設定ファイル
    ├── docker_exe.sh
    ├── docker_rm_all.sh
    ├── docker_rmi_all.sh
    └── setup_docker_cmd

```

#使用方法
##環境構築
###Vagrant up
(入っていない人のみ)Vagrant用のvagrant-vbguest、vagrant-gatling-rsyncプラグインをインストールします。

```
cd /your/path/Vagrant-samples/Skeleton-nginx-nodejs-mongodb
vagrant plugin install vagrant-gatling-rsync
vagrant plugin install vagrant-vbguest
```
Skeleton-nginx-nodejs-mongodb ディレクトリで Vagrant up します。
初回はダウンロード等でしばらく時間がかかります。

```
cd /your/path/Vagrant-samples/Skeleton-nginx-nodejs-mongodb
vagrant up
```
vagrant up後に
gatling-rsyncが動きます。
止めた場合には編集後のファイルの反映のため

```
vagrant gatling-rsync-auto
```
コマンドを叩いて再度syncをスタートするようにして下さい。


###とりあえずの動作確認
nginx:
下記URLをブラウザ（もしくはcurl）で開いてhello nginxページが表示される
http://192.168.33.10/

nodejs:
下記URLをブラウザ（もしくはcurl）で開いてhello nodeページが表示される
http://192.168.33.10/app/

mongodb:
ホストからmongoコマンドかmongo用のツールで
192.168.33.10:27017
につながること

##開発方法

Vagrant-samples/Skeleton-nginx-nodejs-mongodb/Skeleton-nginx-nodejs-mongodb/dockers配下に各docker用のファイルが配置してあります。
Dockerfileがそれぞれ配置してありますが、
下記の公式のイメージを取得し日本時間に変更しているのみです
nginx:1.13.3
node:7.10.1
mongo:3.4.7
※mongoに関してはデータ用のディレクトリの作成をしています。
違うイメージにしたい場合は適宜編集をして下さい。

各ログは
dockers/XXX/log配下に出力しているので

```
tail -f  ./dockers/*/log/*
```
のみですべて参照できます。

###nginx
```
nginx
├── Dockerfile
├── conf.d
│   └── default.conf
├── log
│   ├── access.log
│   └── error.log
└── www
    └── index.html
```
wwwディレクトリ配下が静的コンテンツ用のディレクトリになります。
静的ファイルを変更したい場合はここのファイルを編集します。
編集後自動でdockerに反映されます。
また、nginxの設定を変更したい場合は
conf.d/default.conを変更しvagrant provisionかnginxのdockerのstop/startをして下さい。
現状は/appをnodeへproxyする設定

```
location /app/ {
        proxy_pass http://192.168.33.10:8080/;
    }
```
が入っています。


###nodejs
```
node/
├── Dockerfile
├── log
│   └── node-express.log
└── src
    ├── jsconfig.json
    ├── modules
    │   └── logger.js
    ├── package.json
    ├── routes
    │   ├── index.js
    │   ├── mongo.js
    │   └── router.js
    ├── server.js
    └── views
        ├── error.ejs
        ├── index.ejs
        └── mongo.ejs
```
srcディレクトリ配下が動的用のコンテンツ(nodejs用のファイル)になります。
現在サンプルとしてmongo接続用のファイルが設置されています。
nodejsの編集したい場合はこのファイルを編集して下さい。
編集後自動でdockerに反映され、foreverが再起動します。


また、nodejsのデバッグ起動の設定、デバッグ用ポート（9229）のdockerへのフォワード設定をしていますので、デバッグしながら実行することができます。
デバッグに関しては下記を参照して下さい。
[Visual Studio Codeでリモートサーバー上のNodejsをデバッグする](http://qiita.com/Manjiii/items/2cdaab46e24bdaabde6f)
※src内に設定済みの.vscode/launch.jsonを設置してあるのでVisual Studio Codeの設定追加は必要ありません。

モジュールの追加、削除等を行いたい場合はpackage.json編集後にvagrant provisionするか

```
docker start -i npm-install
```
をvagrant上で行って下さい。
※node_modulesはvagrant/docker上のみに存在し、ホストのディレクトリには反映されません。


###mongodb

```
mongodb/
├── Dockerfile
├── init
│   └── initialData.sh
└── log
    └── mongodb.log
```
init/initialData.shにサンプルデータのインポート用のコマンドが書かれています。
このファイルはmongoのdockerの/tmpディレクトリにコピーするようになっているので
初期データとして入れたい場合は
vagrant上で

```
docker exec -it mongodb bash /tmp/initialData.sh
```
を実行して下さい。
通常データの投入などは

```
docker exec -it mongodb bash
```
でdockerに直接入ってmongoコマンドを叩くか
ホストからmongoコマンドかツールで
192.168.33.10:27017
で接続できます。

mongodbのデータに関しては永続化のためvagrant上の
/vagrant/mongodb/db
にマウントしています。（dockerを止めてもデータが消えません）
このデータのバックアップをしたい場合には

```
cd Skeleton-nginx-nodejs-mongodb
bash set_ssh.sh  #<- sshキーを登録してscpできるようにしています。
cd backup/mongo
bash  backup_mongo.sh
```
を実行して下さい。
レストアするときは

```
cd Skeleton-nginx-nodejs-mongodb/backup/mongo
bash restore_mongo.sh
```

を実行します。


#VM上のディレクトリ構成
ホストのディレクトリ構成は上記の通りですが、
VM上には/var/dockerディレクトリに展開しています。

```
/var/dockers/
├── mongodb
│   └── log
├── nginx
│   ├── conf.d
│   ├── log
│   └── www
└── node
    ├── log
    └── src
```
vagrantはデフォルトで/vagrantにsyncされますが
上書き等を防ぐためdisableにし、必要なディレクトリのみsyncするようにしています。
また、mongodbのデータに関しては永続化のために
/vagrant/mongodb/db
にマウントしています。

monogodbのデータに関しては
上述の通り
/vagrant/mongodb/db
内に保存しています。

（詳しくはVagrantfileを参照して下さい。）

#この環境について
随時更新していく予定です。
おかしいところや改善点等ありましたら教えて頂けると助かります。