はじめに
Node.jsとMongoDBの組み合わせのDocker環境をネットで調べると、ちゃんと動くものがなかったので、自分で作成しました。
環境構成
WebフレームワークはNode.js、データベースはMongoDBを使用します。
また、Nginxのリバースプロキシを用いて、Node.jsに接続できる環境にしています。
ディレクトリ構成
my-project
|-- nginx
| └ site.conf
|-- server
| ├ Dockerfile
| ├ package.json
| ├ package-lock.json
| └ app.js
└-- docker-compose.yml
/nginx
site.confにはNginxのリバースプロキシの設定を書きます。
site.conf
server {
listen 80;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /app;
location / {
# リバースプロキシ設定
proxy_pass http://server:8080/;
}
}
/server
server内のDockerfileには、Node.jsの環境設定を書きます。
(以下のファイル名の末尾のコンマは無視してください)
Dockerfile.
FROM node:alpine
# ワーキングディレクトリを作成
WORKDIR /usr/src/app
# アプリケーションの依存関係をインストールする
COPY package*.json ./ # package-lock.jsonもコピーするために*(ワイルドカード)を使用しています
RUN npm install
# アプリケーションのソースをバンドルする
COPY . .
# アプリケーションを起動
CMD [ "node", "app.js" ]
package.jsonは手書きするか npm init を使用して作成します。
以下に、サンプルを記述しておきます。
mongooseをインストールしておかないと、MongoDBとの接続を確認できないので、注意してください。
package.json
{
"name": "server",
"version": "1.0.0",
"description": "Node.js on Docker",
"main": "app.js",
"author": "sample",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"mongoose": "^5.9.7"
}
}
app.jsは手書きします。
app.js
// モジュールをロード
const express = require("express"),
mongoose = require("mongoose");
// ポートとホストを設定
const PORT = 8080;
const HOST = "0.0.0.0";
// expressを使用
const app = express();
// データベース接続
mongoose.connect(
"mongodb://mongo/test", // testというDBに接続しています
{ useUnifiedTopology: true,
useNewUrlParser: true
}
);
const db = mongoose.connection;
db.once("opne", () => {
// 接続できると以下のログが出力されます。
// 接続できない場合はエラーが出力されます。
console.log("Success MongoDB connected!!");
});
// 指定されたポートを監視
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
/
docker-compose.ymlには、全体の構成を書きます。
docker-compose.yml
version: '3'
services:
server:
build: ./server
container_name: "server"
ports:
- 8080:8080
links:
- mongo
depends_on:
- mongo
volumes:
- ./server:/server
- /home/app/nodeapp/node_modules
nginx:
image: nginx:latest
container_name: "nginx"
ports:
- "80:80"
depends_on:
- server
volumes:
- ./server:/server
- ./nginx/site.conf:/etc/nginx/conf.d/default.conf:cached
mongo:
image: mongo
container_name: "mongo"
command:
- mongod
ports:
- 27017:27017
volumes:
- mongo-data:/data/db
mongo-data:
image: busybox
volumes:
mongo-data:
MongoDB内のデータの永続化
docker-compose.yml内に書いている mongo-data の image: busybox でデータの永続化をしています。
これによって、dockerコンテナをダウンさせても、次回立ち上げ時にデータを維持することができます。