WEB

TypeScript + Express + mongoDBの環境をDockerで構築する

WEB
この記事は約6分で読めます。

※ monoose使用

Webサーバを作成

パッケージのインストール

npm init
npm i express mongoose
npm i -D nodemon typescript ts-node @types/node

その他の型定義パッケージは後で適当にインストールする。

tsconfigの作成

npx tsconfig.json

npm script

package.json

"scripts": {
    "start": "NODE_ENV=production node server",
    "dev": "nodemon -L",
    "seed": "ts-node seeder.ts"
  },

nodemonの設定

nodemon.json

{
  "watch": ["src"],
  "ext": "ts",
  "exec": "ts-node ./src/server.ts"
}

アプリケーションの作成

src/server.js

/**
 * サーバインスタンス
 */
const app = express();
app.use(express.json());

/**
 * 開発環境: ログの有効化
 */
if (process.env.NODE_ENV === "development") {
  app.use(morgan("dev"));
}

/**
 * サーバーの起動
 */
const server = app.listen(process.env.PORT || 3000, () =>
  console.log(`${process.env.NODE_ENV} server is listening on PORT: ${process.env.PORT}`)
);

/**
 * Handle Unhandled Rejections
 */
process.on("unhandledRejection", (err, promise) => {
  console.log("<)))><...Error: unhandledRejection", err);

  server.close(() => process.exit(1));
});

起動確認

npm run dev

curl -i http://localhost:3000/

Dockerコンテナ化

Dockerfile作成

touch Dockerfile
FROM node:dubnium

RUN mkdir /app

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

EXPOSE 3000

CMD bash -c "npm install && npm run dev"

起動確認

docker build -t node-test:0.1 .
docker run -p 3000:3000 -ti node-test:0.1

Docker-Compose

touch docker-compose.yml

docker-compose.yml

version: "2"
services:
  web:
    build: .
    volumes:
      - ./:/app
    ports:
      - "3000:3000"
    links:
      - mongo

  mongo:
    image: mongo
    ports:
      - "27017:27017"
    logging:
      driver: none
    volumes:
      - ./mongo_db:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: root
    logging:
      driver: none

補足

mongo-express

DBをブラウザからGUIで確認できる。
あると少し便利なので入れてある。

データの永続化

volumes:
      - ./mongo_db:/data/db

docker-compose.ymlと同じ階層に、mongo_dbフォルダを作成しておき、volumesとして使用する。
こうすることでコンテナ落としてもデータは保持される。

git管理はしない。

.gitignore

node_modules/
mongo_db/
config/config.env

起動確認

docker-compose up

DB接続

接続用モジュール

mkdir config
cd config
touch db.js

config/db.js

var mongoose = require("mongoose");
const dotenv = require("dotenv");

// 環境変数の読込
dotenv.config({ path: "./config/config.env" });

//DB接続
const connectDB = async () => {
  const conn = await mongoose.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  });

  console.log(`<)))><...mongoDB Connected: ${conn.connection.host}`);
};

module.exports = connectDB;

接続

src/server.js

import connectDB from "../config/db";

/**
 * DB接続
 */
connectDB();

/**
 * サーバインスタンス
 */
const app = express();

...省略

完了/起動確認

docker-compose up