LoginSignup
11
15

More than 3 years have passed since last update.

Node.jsとMongoDBの環境をDockerで構築

Posted at

はじめに

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コンテナをダウンさせても、次回立ち上げ時にデータを維持することができます。

11
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
15