Closed5
Node.js で REST API を Docker 上で作る
ピン留めされたアイテム
目的
- Node.js で API 書いて見たかったので簡単な ToDo アプリを作ってみる。
- Express 初めて触ってみる。
- docker compose で作ってみる。
構成
- API
- Node.js ( Express )
- DB
- MySQL
- リバースプロキシ
- Nginx
今回やらないけど次回やってみたいこと
- API の TypeScript 化
- フロントエンドの SPA 化
- 今回は Express のテンプレートエンジンを使用するので、次やる場合はフロントは分けたい。(その際は、React で書きたい。)
大まかなディレクトリ構成
ざっくり Docker 関連とアプリのソースコードの分けた。
$ tree
.
├── Makefile
├── docker-compose.yaml
├── services # コンテナ関連
│ ├── mysql
│ ├── nginx
│ └── node
└── src # API のソースコード
├── app.js
├── package.json
└── yarn.lock
プロジェクト全体のコンテナ化
複数コンテンを扱うため 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:
各サービス
アプリケーションサービス
主に Express フレームワークを使用した Node.js を動かすためのコンテナ。
こちらを参考にした。
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
作ったの 1 年前くらい前だけどスクラップをクローズするのを忘れていた
このスクラップは2023/01/11にクローズされました