Closed5

Node.js で REST API を Docker 上で作る

ピン留めされたアイテム
ega4432ega4432

目的

  • Node.js で API 書いて見たかったので簡単な ToDo アプリを作ってみる。
  • Express 初めて触ってみる。
  • docker compose で作ってみる。

構成

  • API
    • Node.js ( Express )
  • DB
    • MySQL
  • リバースプロキシ
    • Nginx

今回やらないけど次回やってみたいこと

  • API の TypeScript 化
  • フロントエンドの SPA 化
    • 今回は Express のテンプレートエンジンを使用するので、次やる場合はフロントは分けたい。(その際は、React で書きたい。)
ega4432ega4432

大まかなディレクトリ構成

ざっくり Docker 関連とアプリのソースコードの分けた。

$ tree
.
├── Makefile
├── docker-compose.yaml
├── services                  # コンテナ関連
│   ├── mysql
│   ├── nginx
│   └── node
└── src                        # API のソースコード
    ├── app.js
    ├── package.json
    └── yarn.lock
ega4432ega4432

プロジェクト全体のコンテナ化

複数コンテンを扱うため Docker Compose を利用。

上で services ディレクトリにコンポーネントのリストを書き出しているのでなんとなく想像はできるかもしれないが、以下のような構成にした。

docker-compose.yaml
version: '3.9'

services:
  app: 
    container_name: node  # Node コンテナ
  proxy:
    container_name: nginx  # Nginx コンテナ
  db:
    container_name: mysql  # MySQL コンテナ

volumes:
ega4432ega4432

各サービス

アプリケーションサービス

主に Express フレームワークを使用した Node.js を動かすためのコンテナ。
こちらを参考にした。

https://nodejs.org/ja/docs/guides/nodejs-docker-webapp/

FROM node:16.13.0-alpine3.12

WORKDIR /usr/src/app

COPY src/package.json src/yarn.lock ./

RUN yarn --frozen-lockfile

COPY . .

EXPOSE 3000

CMD [ "yarn", "start" ]

リバースプロキシサービス

Nginx を使用。設定ファイルを作成しコンテナにコピー。

FROM nginx:1.21.3-alpine

COPY ./services/nginx/conf.d/*.conf /etc/nginx/conf.d/

CMD [ "nginx", "-g", "daemon off;" ]

DB サービス

RDB である MySQL を使用。Mongo を使うケースも多く迷ったが今回は慣れている方を選択。

FROM mysql:8.0

ENV TZ=UTC

COPY ./services/mysql/my.cnf /etc/my.cnf

最終的にこんな感じ

% tree ./services
./services
├── mysql
│   ├── Dockerfile
│   └── my.cnf
├── nginx
│   ├── Dockerfile
│   └── conf.d
│       └── default.conf
└── node
    └── Dockerfile
このスクラップは2023/01/11にクローズされました