フロントエンド・ダッシュボードの構築(第一回):MacOS上でNodeとDockerを使ってGridDBをセットアップする

このチュートリアルでは、DockerコンテナにGridDBを搭載したNodeアプリをセットアップします。

このチュートリアルが終わるころには、次のことができるようになります。

  • Docker コンテナによる Node および GridDB アプリのセットアップ
  • GridDBに接続するExpressサーバーの作成

このチュートリアルは、MacOSや他のLinux OSなど、GridDBをサポートしていない環境でGridDBを使用する場合に役立ちます。また、GridDBアプリを他のシステムから分離しておきたい場合にも有効です。

Dockerはすでにシステムにインストールされており、その仕組みもご存じだと思います。また、Node.jsの基本を理解しているものとします。

このチュートリアルの全コードは、このリポジトリからアクセスすることができます。

Nodeアプリのセットアップ

最初に行うのは、簡単なNodeアプリのセットアップです。後ほど、コンテナ化し、GridDBを統合します。

プロジェクトディレクトリの中に、package.json ファイルを作成し、以下の内容を追加します。

package.json

{
  "name": "griddb-node-docker",
  "version": "1.0.0",
  "description": "",
  "author": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  }
}

ご覧のように、メインアプリのファイルとなる server.js を実行する start スクリプトを用意しました。

では、そのファイルを作成して、”Hello, World” というメッセージをコンソールログに出力してみましょう。

server.js

console.log('Hello, World');

この動作を確認するために、ターミナルから npm run start を実行すると、メッセージが表示されるはずです。

$ npm run start

Expressサーバー

簡単なNodeサーバーを作成できるExpressをインストールしましょう。

$ npm i -S express

ここで、server.js ファイルに Express をセットアップします。先ほどの内容を置き換えてください。

server.js に置き換えてください。

const express = require('express');

const PORT = 3000;
const HOST = '0.0.0.0';

const app = express();
app.get('/', (req, res) => {
  res.send('Hello, World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

このコードでは以下のことを行っています。

  • Expressモジュールの読み込み
  • Expressアプリの作成
  • ルートパスに対して “Hello, World” というテキストを送信するハンドラの作成
  • localhost:3000でのリッスン

それでは、Expressサーバーを起動してみましょう。

$ npm run start

Expressサーバーが動作していることを確認するために、別のターミナルでCurlを使用してみましょう。

$ curl http://localhost:3000

YHello, World “のメッセージが返ってくるはずです。

Nodemon

Node/Express アプリに変更を加えた場合、変更を反映させるためにサーバーを手動で再起動する必要があります。

これは Docker を使って開発する場合には理想的ではありません。なぜなら、Docker アプリを起動し、停止し続けなければならないからです。

より良い解決策は nodemon パッケージを使用してサーバを実行することです。このパッケージはファイルを監視し、何か変更があった場合は自動的にサーバを再起動します。

Expressサーバを終了して(Ctrl+C)、Nodemonをインストールしましょう。

$ npm i -S nodemon

ここで、package.jsonの起動スクリプトを変更し、Nodemonを使用するようにします。

package.json

{
  ...
  "scripts": {
    "start": "nodemon server.js"
  }
}

ここで、server.js ファイルに何らかの変更を加えると、Express サーバーは自動的に再起動します。

Node アプリコンテナ

さて、Node/ExpressアプリをDockerでコンテナ化します。また、NodeアプリがGridDBと通信できるように、Node GridDBコネクタも含める予定です。

app ディレクトリに新規ファイル Dockerfile を作成し、以下をインクルードします。

FROM node:10

RUN wget https://github.com/griddb/c_client/releases/download/v4.3.0/griddb-c-client_4.3.0_amd64.deb
RUN dpkg -i griddb-c-client_4.3.0_amd64.deb

WORKDIR /opt/nodejs
COPY package*.json ./
RUN npm install --quiet

ENV LD_LIBRARY_PATH /usr/griddb_c_client-4.3.0/lib/

ここでは以下のことを行っています。

  • 公式の Node v10 イメージをベースとして使用します。
  • GridDB Node コネクタをダウンロードし、インストールします
  • コンテナ内にアプリ用のディレクトリを作成し、そこにパッケージの json ファイルをコピーします
  • NPMの依存関係をインストールします
  • GridDBコネクタの場所を環境変数に設定します

これが終われば、あとはイメージをビルドするだけです。

docker build . -t node-express-griddb

-t フラグを使うと、イメージにタグを付けることができるので、簡単に見つけることができます。

イメージのビルドが完了したら、ターミナルで docker images を実行すると、以下のように表示されるはずです。

REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
node-express-griddb       latest    8c191df53772   13 seconds ago   954MB

Docker ComposeでGridDBを追加する

これで、NodeアプリとGridDB Nodeコネクタをイメージ化することができました。動作するアプリを作るために、Docker Composeを使ってGridDBを追加していきます。

アプリのディレクトリに docker-compose.yml というファイルを作成し、以下を記述します。

version: "3.8"
services:
  web:
    build:
      context: ./
    volumes:
      - .:/opt/nodejs
            - /opt/nodejs/node_modules
    command: npm run start
    ports:
      - "3000:3000"
    depends_on:
      - griddb
  griddb:
    image: "griddbnet/griddb"

ここでは以下のことを行っています。

  • 作成したイメージを使用するサービスを作成します
  • コンテナ内のカレントディレクトリをマウントします
  • 3000番ポートを公開します
  • 公式GridDB Dockerイメージ]3から、2つ目のサービスを作成します

また、特定のファイルを無視するようにDockerに指示するファイル .dockerignore を作成する必要があります。アプリのディレクトリをマウントするため、ローカルの環境ファイルやプロジェクトファイルは含めないようにします。

node_modules
npm-debug.log
.git
.idea

Dockerアプリを実行する

これでサービスの定義ができましたので、アプリケーションを構築します。

$ docker-compose up

別の端末で、よくCurlを使って、アプリが動作していることを確認します。

$ curl http://localhost:3000

再び「Hello, World」メッセージが戻ってくるはずです。しかし今回は、アプリは分離されたDocker環境から実行されています。

GridDB Node クライアントを使う

これで、Docker化されたNodeとGridDBの環境が整いました。これで、GridDBを利用したアプリの開発を開始できます。

まず、GridDBのNodeクライアントパッケージを利用する必要があるので、それをインストールしましょう。

$ npm i -S griddb_node

注意:新しいパッケージをインストールした後、NPMの依存関係がイメージに書き込まれるため、イメージを再構築する必要があります。そのためには、docker-composeアプリを終了して、docker-compose up --build を実行すると、再び起動し、イメージを再構築することができます。

新規ファイル db.js を作成し、GridDB インスタンスを Express サーバで使用できるよう設定します。

db.js を作成します。

const griddb = require('griddb_node');

const connect = () => {
  const factory = griddb.StoreFactory.getInstance();
  return factory.getStore({
    "notificationMember": "griddb:10001",
    "clusterName": "defaultCluster",
    "username": "admin",
    "password": "admin"
  });
};

module.exports = { connect };

これは、GridDBストアを返すメソッド connect をエクスポートします。Docker環境では、GridDBコンテナが10001番ポートを公開しているため、問題なく動作します。

ExpressアプリでGridDBに接続する

これで、メインのサーバーアプリに db モジュールを要求できるようになりました。コネクト`を呼び出すと、GridDBコンテナの読み書きに使用できるStoreインスタンスが返されます。

server.js

const express = require('express');
const db = require('./db');

const store = db.connect();

...

これで当ブログ連載の第一回は終了です。第二回では、今回得た知識をもとに、実際にダッシュボードを作成していきます。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *