「インフラ」カテゴリーアーカイブ

Nginx/React/MongoDB on Docker の構築 その5 Reactからバックエンドへの接続

先日作ったバックエンドに対して、Reactから情報を取るところまで。
追加とか削除は同じようにロジック追加するだけなので割愛。

準備

nginxのDockerを立ち上げて、Reactをインストールしその上で作業。
以前Reactのインストールをnginx上で行ったので、そのDockerを使った。
もちろん、Docker上で試す必要はない。

React-Bootstrapのインストール

見た目とか色々いじるのはめんどくさいので、簡単なBootstrapを使用。
React-Bootstrapなるものがあるらしく、Reactのアプリを作成後にインストール。
いつも通り公式のGetting Startedを参考に

create-react-app frontend
cd frontend
npm install --save react react-dom
npm install --save react-bootstrap

この状態でnpm startすると前回のデモアプリと同じ以下の画面が出るはず。

PORT=80 npm start

React App

続いて、Bootstrapを使うためにCSSを追加する。

vi public/index.html

# <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
# を<head>内に追加

TODOを表示するテーブルを作成

src/App.jsにTODOリストのテーブルを追加。
todosに後々取得したデータが入る予定で、各行の表示はsrc/EntryRow.jsに記載。

import React, { Component } from 'react';
import { Table } from 'react-bootstrap';
import EntryRow from './EntryRow';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {todos: ''};
  }
  entryRow(){
    if(this.state.todos instanceof Array){
      return this.state.todos.map(function(object, i){
          return <EntryRow obj={object} key={i} />;
      })
    }
  }
  render() {
    return (
      <div className="App">
        <Table striped bordered condensed hover>
          <thead>
            <tr>
              <th>Id</th>
              <th>Name</th>
            </tr>
          </thead>
          <tbody>
            {this.entryRow()}
          </tbody>
        </Table>
      </div>
    );
  }
}
export default App;

続いて、src/EntryRow.jsにTODOリストの各行を追加するロジックを追加。

import React, { Component } from 'react';

class EntryRow extends Component {
  render() {
    return (
        <tr>
          <td>
            {this.props.obj._id}
          </td>
          <td>
            {this.props.obj.name}
          </td>
        </tr>
    );
  }
}

export default EntryRow;

この状態で画面にテーブルができる。もちろん、todosの中は空なので何も表示されない。

todo-table1

TODOのリストを取得して表示

HTTPのリクエストにはaxiosを使用。
追加でaxiosもインストール。

npm install --save axios

src/App.jsに前回作成したフロントエンドに対してリクエストを投げるロジックを追加する。
頭にモジュールのインポートを追加。

import axios from 'axios';

リクエストのロジックをconstructorとrenderの間くらいに挿入する。 IPアドレスやポートなどは環境に合わせて。

  componentDidMount(){
    axios.get('http://<ip>:3000/api/tasks')
    .then(response => {
      this.setState({ todos: response.data });
    })
    .catch(function (error) {
      console.log(error);
    })
  }

動作確認

PORT=80 npm start

以前追加したタスクがあれば、画面に表示されるはず。

todo-table2

ちなみに、オリジン間リソース共有ができない設定では正しく表示されない。
テストなので、ChromeにAllow-Control-Allow-Origin: *などの拡張を入れて対応も可能。

おわり

やっと通して動くようになった。
次は、Dockerのイメージとして動かせるようにする。

Nginx/React/Express/MongoDB on Docker の構築 その4 バックエンドサーバ構築 Express on Docker

今回はExpressを使って、バックエンドを構築。
具体的には、Expressを使って、MongoDBを操作するAPIのサーバを構築する。

Expressは小さくて柔軟なwebフレームワーク。
今回は、GET/POST/DELETEに合わせてDBの取得/追加/削除のロジックを構築する。

CentOSのDockerを作成

まずはいつも通りCentOSのDocker作成から

docker run -itd --privileged -p 3000:3000 --name express centos:7 /sbin/init
docker exec -it express /bin/bash

3000番ポートを外部に公開する。

node.jsのインストール

前回と同様にnode.jsのインストール。

yum install -y epel-release
yum install -y nodejs npm

Expressのインストール

ここを参考に、新規アプリケーションを作成していく。

create-react-appでReactのアプリケーションを作成。npm initのとき色々聞かれるけど、空白のままで。

mkdir backend
cd backend/
npm init

続いて、expressのモジュールをインストール

npm install express --save

このコマンドを実行すると、package.jsonの中にexpressのパッケージが追加される。

他に必要なパッケージの追加

  • body-parser
    POSTパラメータをJsonで取得するのに必要

  • mongoose
    MongoDBにつなぐためのモジュール

npm install body-parser --save
npm install mongoose --save

これでpackage.jsonは以下の通り3つのモジュールが追加されている。

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.3",
    "mongoose": "^5.0.10"
  }
}

動作確認

とりあえず動かしてみる。
チュートリアルのExampleにあるコードをコピーしてindex.jsとして保存。

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

expressの起動

node ./index.js

その後、Dockerの外からホストの3000宛にHTTPリクエストを投げて確認。

$ curl -X GET http://localhost:3000
Hello World!

APIの設計

今回はTODOアプリを想定。

DB

MongoDBにはタスク用のDBが用意されていると想定する。
中身はシンプルで、tododbという名前のDB内にtasksテーブルを作成して、nameのフィールドを持つエントリが増えていく形。

  • tododb
    • tasks
      • name

API

  • GET /api/tasksでタスクリストの取得
  • POST /api/tasksでタスクリストの追加
  • DELETE /api/tasks/:idでタスクリストの削除

Expressの実装

Mongooseを使っているので、この簡単なチュートリアルをコピペして、DBとのやりとりを作る。
index.jsにロジックを追加していく。勉強用なので、MongoDBのアクセス先もべたがき。
アドレスは 172.17.0.4 で、ポートはデフォルトの 27017

var express = require('express');
var bodyParser = require('body-parser');
var mongoose   = require('mongoose');

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

var router = express.Router();
mongoose.connect('mongodb://172.17.0.4/tododb');

const Task = mongoose.model('Task', { name: String });

router.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

router.route('/tasks')
  .post(function(req, res) {
    var task = new Task();
    task.name = req.body.name;
    task.save(function(err) {
      if (err)
        res.send(err);
      res.json({ message: 'task created' });
    });
  })
  .get(function(req, res) {
    Task.find(function(err, tasks) {
      if (err)
        res.send(err);
      res.json(tasks);
    });
  });

router.route('/tasks/:id')
  .delete(function(req, res) {
     Task.remove({
       _id: req.params.id
     }, function(err, task) {
       if (err)
         res.send(err);
       res.json({ message: 'task deleted' });
     });
  });


app.use('/api', router);
app.listen(3000);

APIサーバの動作確認

上記ファイルを作成するとbackendフォルダ内が以下のようになる。

$ ls -l
total 16
-rw-r--r--.  1 root root 1071 Mar 14 02:08 index.js
drwxr-xr-x. 67 root root 4096 Mar 14 01:39 node_modules
-rw-r--r--.  1 root root  342 Mar 14 01:42 package.json

Expressを起動する

node ./index.js

外部から動作確認。
ちなみに、テスト環境では172.17.0.4のDocker上でMongoDBがデフォルトポート(27017)で待ち受けている前提。

最初は何もタスクがない状態。GETしても何も得られない。

$ curl -X GET http://localhost:3000/api/tasks
[]

新しいタスクを追加してみる。OKのメッセージが返ってきたら取得して確認。

$ curl --data-urlencode "name=task1" -X POST "http://localhost:3000/api/tasks"
{"message":"task created"}

$ curl -X GET http://localhost:3000/api/tasks
[{"_id":"5aa8846f3a07580112286a66","name":"task1","__v":0}]

ちゃんと追加されているので、削除して確認。

$ curl -X DELETE http://localhost:3000/api/tasks/5aa8846f3a07580112286a66
{"message":"task deleted"}

$ curl -X GET http://localhost:3000/api/tasks
[]

おわり

CRUDのUは実装していないけど、APIサーバとしては今は十分。
次はReactからこのAPIサーバにリクエストしてページに表示するところ。

Nginx/React/Express/MongoDB on Docker の構築 その3 React on Nginx on Docker

React

Reactはwebアプリのフロントエンド開発用ライブラリ。
公式によると宣言型で効率的かつ柔軟なJavascriptライブラリらしい。
インフラエンジニアのイメージとしては、クライントサイドでの実装を簡単に作れるライブラリという勝手なイメージ。
Webページにあるフォームのチェックやサジェスト機能を実装できる。

React 開発用Dockerを作成

前回作成したnginxのイメージからDockerを建てる

docker run --name nginx -d -p 10080:80 ytsuboi/nginx:1.0

node.jsのインストール

yumを使って、node.jsのインストールを行う。これでnpmコマンドが使用可能になる。
npmはjavascript用のパッケージ管理ツールで、RubyのRubyGems。PythonのPipにあたる。

yum install -y epel-release
yum install -y nodejs npm

create-react-appでReactのアプリケーションを作成

これでnodejsを使う準備ができたので、React用のライブラリをインストールして、初期アプリケーションを作成する。
初期アプリケーションの作成にはcreate-react-appを利用する。
この手順の通り、Reactの新規アプリケーションを作成する際に使えるツール。

npm install -g create-react-app
create-react-app <application name>

<application name>でフォルダが作成されると思うが、その中のファイルを編集してReactのアプリを作成していく。
今回はこのままでアプリを動かしてみる。
ちなみに、buildせずにnpm startで動かすには、まずnginxを止めてから80ポートで起動してあげれば外部から10080ポートでアクセスできる。

sysatemctl stop nginx
PORT=80 npm start

アプリケーションのビルド

実環境で動作させる場合には、開発したReactのアプリケーションをビルドする必要がある。
npm run buildを行うと、/build/フォルダが作成される。
このフォルダをnginx上で公開することでReactのwebアプリケーションにアクセスができるようになる。

npm run build

ビルドしたアプリケーションを/var/www/<application name>にコピーする。

mkdir /var/www
cp -r build /var/www/<application name>

nginx上で動かす

nginx上でVirtualHostを作成する。
編集するファイルは/etc/nginx/conf.d/default.confを用いる。
公開するフォルダを/var/www/<application name>とするとnginxの設定は以下のようになる。

server {
    listen       80 default_server;
    root /var/www/<application name>;
    server_name  localhost;

    access_log  /var/log/nginx/host.access.log  main;
    index index.html index.htm;

}

今回は簡単な設定だけを記載。
80ポートに来たHTTPのリクエストは/var/www/<application name>配下のファイルを返す。
ファイル名を指定しない場合には、デフォルトでindex.htmlまたはindex.htmを返す。

設定が完了したらnginxを再起動する。

systemctl restart nginx

外部からホストのIPとポートでアクセスして次の画面が出れば成功。

React App

おわり

nginx上で公開する方法がわかったので、次はNode.jsを使ってmongoDBにアクセスするところをやっていこう。
これらの設定やアプリケーションをコンテナ化するのはまたその後で。

Nginx/React/Express/MongoDB on Docker の構築 その2 Nginx

第二弾。次はnginxをDocker上に構築する。
やり方はMongoDBのときと一緒。

nginx

nginxはHTTPサーバやロードバランサー用途で使用可能なオープンソースソフトウェア。
ここに機能のまとめがあるが、
オープンソースバージョンでも、HTTPサーバとしての用途であれば十分な機能がサポートされている。
結局Apacheとどう違うの?という疑問がわく。ここに簡単な比較がある。
大きな違いとしてはApacheはプロセスベースに対し、nginxは非同期のイベント駆動型であるということ。VPSなどの限られた環境下においては、オーバヘッドの少ないイベント駆動型のnginxなどが適しているということらしい。
ちなみに読み方はエンジンエックスなので。お気をつけ。

CentOSのDockerを建てる。

前回記事を参照。

$ docker run -itd --privileged --name nginx centos:7 /sbin/init
3dc3e9021f943139eac03d3e37a7252a094371b42a51b876893d039ea0bf2f53

nginxのインストール

インストールはここを参照
基本的な流れ
– レポジトリの追加
– yumを使ってインストール
– systemctlを使ってnginxを起動

レジストリの追加

$ docker exec -it nginx /bin/bash
[root@3dc3e9021f94 /]# cat << 'EOF' > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
EOF
[root@3dc3e9021f94 /]#
[root@3dc3e9021f94 /]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@3dc3e9021f94 /]#

yumを用いたnginxのインストール

[root@3dc3e9021f94 /]# yum install -y nginx

nginxの有効化

[root@3dc3e9021f94 /]# systemctl start nginx

nginxの確認

  • statusでactiveかどうか確認
  • curlで初期ページが返ってくるか確認
[root@3dc3e9021f94 /]# systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2018-02-28 04:31:21 UTC; 1s ago
     Docs: http://nginx.org/en/docs/
  Process: 176 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
  Process: 175 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 177 (nginx)
   CGroup: /system.slice/docker-3dc3e9021f943139eac03d3e37a7252a094371b42a51b876893d039ea0bf2f53.scope/system.slice/nginx.service
           ├─177 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           └─178 nginx: worker process

Feb 28 04:31:21 3dc3e9021f94 systemd[1]: Starting nginx - high performance web server...
Feb 28 04:31:21 3dc3e9021f94 nginx[175]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Feb 28 04:31:21 3dc3e9021f94 nginx[175]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Feb 28 04:31:21 3dc3e9021f94 systemd[1]: Failed to read PID from file /var/run/nginx.pid: Invalid argument
Feb 28 04:31:21 3dc3e9021f94 systemd[1]: Started nginx - high performance web server.
[root@3dc3e9021f94 /]#
[root@3dc3e9021f94 /]# curl http://localhost/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@3dc3e9021f94 /]#

次にDockerfileからイメージをビルドするので、使用していたcentosのコンテナを削除する

$ docker kill nginx
nginx
$ docker rm nginx
nginx

nginx用Dockerfileの作成

MongoDBのときと同様に使用したコマンドをDockerfileに書いていくだけ。
ちなみにDockerfilenの中では、ヒアドキュメントが使えないのでechoに書き換えている。

FROM centos:7
MAINTAINER "yuki"

RUN yum update -y && yum clean all
RUN touch /etc/yum.repos.d/nginx.repo
RUN echo '[nginx]' >> /etc/yum.repos.d/nginx.repo
RUN echo 'name=nginx repo' >> /etc/yum.repos.d/nginx.repo
RUN echo 'baseurl=http://nginx.org/packages/centos/$releasever/$basearch/' >> /etc/yum.repos.d/nginx.repo
RUN echo 'gpgcheck=0' >> /etc/yum.repos.d/nginx.repo
RUN echo 'enabled=1' >> /etc/yum.repos.d/nginx.repo
RUN yum install -y nginx && yum clean all

# Enable nginx
RUN systemctl enable nginx

# Start init daemon
CMD ["/sbin/init"]
$ docker build -t ytsuboi/nginx:1.0 .
Sending build context to Docker daemon  2.56 kB
Step 1 : FROM centos:7
 ---> ff426288ea90
Step 2 : MAINTAINER "yuki"
 ---> Running in ca8d4bff0980
<snip>
Successfully built 1d391618c76c
[ytsuboi@cent:nginx] $

nginx dockerの起動

ローカルの10080ポートをnginxのコンテナのポート80に割り当てて、外部からアクセスするようにする。
使用するのはdocker runの以下のオプション。

  -p, --publish value               Publish a container's port(s) to the host (default [])

起動してみる

$ docker run --name nginx -d -p 10080:80 ytsuboi/nginx:1.0

起動後にコンテナを起動したホストから10080ポートにアクセスできるか確認。

 $ curl http://localhost:10080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

ちなみに、iptablesssからポートが空いていることと、DNATされていることも確認できる。

$ ss -tln
State       Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port
<snip>
LISTEN      0      128                                    :::10080                                              :::*
$ sudo iptables -n -L DOCKER -t nat
Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:10080 to:172.17.0.5:80

おわり

これでnginxのコンテナが用意できた。ページや設定を変更するにはもう少し作業が必要だが今回は省く。
まずは、nginxが用意できたので、次回node.jsを動かす準備をする。

Nginx/React/Express/MongoDB on Docker の構築 その1 MongoDB

インフラエンジニアとして、上で動くアプリケーションの勉強のため
表題の構成を作る。

まずは、MongoDBをDockerで建てるところから。

MongoDB

もともとDoubleClick社で開発されていたデータベースで所謂NoSQLと呼ばれるもの。
オープンソースで、Failoverもサポートされていて、分散データベースのためスケールアウトもするとのこと。
ここからダウンロード可能。
https://github.com/mongodb/mongo

CentOSベースのDockerを動かす

CentOSベースのイメージをダウンロード

$ docker pull centos:latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
af4b0a2388c6: Pull complete
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d

イメージの確認

$ docker images centos:latest
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              ff426288ea90        7 weeks ago         207.2 MB

CentOSのdockerをデーモンとして動作させる
systemctlを使いたいので、--priviledgedを指定。

$ docker run -itd --privileged --name mongodb centos:latest /sbin/init
72059102d58eb931b92ee1d32b55c759e7e5a46153e99607495756ca47bf6d2a

CentOSのdockerに接続

$ docker exec -it mongodb /bin/bash
[root@72059102d58e /]#

YumからMongodbのインストール

ここを参考に
最後にsystemctl status mongodで状態確認。

[root@72059102d58e /]# touch /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo '[mongodb-org-3.6]' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo 'name=MongoDB Repository' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo 'baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo 'gpgcheck=1' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo 'enabled=1' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# echo 'gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc' >> /etc/yum.repos.d/mongodb-org-3.6.repo
[root@72059102d58e /]# yum install -y mongodb-org
<snip>
[root@72059102d58e /]# systemctl enable mongod
[root@72059102d58e /]# systemctl start mongod
[root@72059102d58e /]# systemctl status mongod
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-02-27 01:36:23 UTC; 2s ago
     Docs: https://docs.mongodb.org/manual
  Process: 171 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 170 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
  Process: 169 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
  Process: 168 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
 Main PID: 173 (mongod)
   CGroup: /system.slice/docker-72059102d58eb931b92ee1d32b55c759e7e5a46153e99607495756ca47bf6d2a.scope/system.slice/mongod.service
           └─173 /usr/bin/mongod -f /etc/mongod.conf

Feb 27 01:36:22 72059102d58e systemd[1]: Starting High-performance, schema-free document-oriented database...
Feb 27 01:36:22 72059102d58e mongod[171]: about to fork child process, waiting until server is ready for connections.
Feb 27 01:36:22 72059102d58e mongod[171]: forked process: 173
Feb 27 01:36:23 72059102d58e systemd[1]: Started High-performance, schema-free document-oriented database.
[root@72059102d58e /]# 

DBに接続してみる

[root@72059102d58e /]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.3
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten]
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten]
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten]
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten]
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-27T01:36:23.109+0000 I CONTROL  [initandlisten]
> show dbs
admin  0.000GB
local  0.000GB
> exit
bye

もうこのdockerはいらないので削除

$ docker kill mongodb
$ docker rm mongodb

Dockerfileを作成して、イメージをBuild

接続できたので、これらをdockerのイメージとしてBuildする

Dockerfileは以下の通り

FROM centos:7
MAINTAINER "yuki"

RUN yum update -y && yum clean all
RUN touch /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo '[mongodb-org-3.6]' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo 'name=MongoDB Repository' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo 'baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo 'gpgcheck=1' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo 'enabled=1' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN echo 'gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc' >> /etc/yum.repos.d/mongodb-org-3.6.repo
RUN yum install -y mongodb-org && yum clean all

# Enable Mongodb
RUN systemctl enable mongod

# Start init daemon
CMD ["/sbin/init"]

イメージをbuild

$ docker build -t ytsuboi/mongodb:1.0 .
Sending build context to Docker daemon  2.56 kB
Step 1 : FROM centos:7
 ---> ff426288ea90
Step 2 : MAINTAINER "ytsuboi"
 ---> Running in e29fc4bca889
 ---> 223b3391b4ee
Removing intermediate container e29fc4bca889
Step 3 : RUN yum update -y && yum clean all
 ---> Running in 5bd346e13c71
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
<snip>
Removing intermediate container da4c2a49ab06
Successfully built 42a0b42361fd
$ docker images ytsuboi/mongodb:1.0
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ytsuboi/mongodb     1.0                 42a0b42361fd        8 minutes ago       575.8 MB

試しにDockerを起動してみる

$ docker run -itd --privileged --name mongodb ytsuboi/mongodb:1.0 /sbin/init
69eacc89ba04324c1b679a724a478c31839355b5b29c15365be2c036fb536b1c
$ docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
69eacc89ba04        ytsuboi/mongodb:1.0   "/sbin/init"        8 seconds ago       Up 8 seconds                            mongodb
$ docker exec -it mongodb /bin/bash
[root@69eacc89ba04 /]#
[root@69eacc89ba04 /]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.3
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten]
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten]
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten]
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten]
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-27T01:43:04.432+0000 I CONTROL  [initandlisten]
>
bye
[root@69eacc89ba04 /]#

おわり

これでMongodbのdockerでの構築終了。
次は、Node.jsあたりからこのDBを操作するあたりを