Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?
@apple-yagi

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

More than 1 year has passed since last update.

はじめに

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

15
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
apple-yagi
1999 | Web Engineer

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
15
Help us understand the problem. What is going on with this article?