このチュートリアルでは、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