Express(Node.js) & MongoDB API using Docker

How to run

docker-compose build
docker-compose up -d api

How to clean up

docker-compose stop
docker-compose down

Configure API call

# GET
$ curl localhost:8888/tasks
# POST
$ curl -X POST -H "Content-Type: application/json" -d '{"name": "test3"}' localhost:8888/tasks 
# PUT
$ curl -X PUT -H "Content-Type: application/json" -d '{"name": "test updated"}' localhost:8888/tasks/61739267ba4b5cfc48dc395a
# DELETE
$ curl -X DELETE -H "Content-Type: application/json" localhost:8888/tasks/61739267ba4b5cfc48dc395a

初期設定

npm init
npm install express
touch index.js

dockerの一連の操作

docker build -t node-app-image .
docker images
# 3000:3000が最初がホストで二つ目がコンテナ
# -v はボリュームを表し、(A):(B)で、Aの変更を自動的にBに反映させてくれる
docker run -v $(pwd):/app -p 3000:3000 -d --name node-app node-app-image
docker exec -it node-app bash // -itはインタラクティブという意味らしい
# コンテナの停止し、イメージも消す
docker rm node-app -f 

Dockerfile

  • RUNはビルド時に実行され、CMDは完成したイメージからコンテナを作成する時に実行される。

docker-compose.yml

  • container_name = コンテナの名前で、docker-compose psを実行した時などに表示される。
  • restart: always = Dockerデーモンの起動時やホストOSの起動時に自動的にコンテナを開始することができる。
  • volumes = コンテナのライフサイクルが終了した後でもデータを保管しておけるデータ領域。今回はdocker-compose.ymlのトップレベルの行で定義しているので、このvolumesは複数のコンテナから参照できる。

ローカルのファイルがコンテナに自動で反映されるようにする。

npm install nodemon --save-dev

package.json

  • これが表しているのは、npm run startもしくはnpm startnode index.jsが実行され、npm run devnodemon index.jsが実行されるという意味。実際には、startの方は不要なので、消しても良い。
"scripts": {
  "start": "node index.js",
  "dev": "nodemon index.js"
}
  • "type"はcommonjsだとimportを標準として、moduleだとrequireを標準としている。
  • 上に関して補足で、例外的にnpm start, npm test, npm restart, npm stopnpm run xxxと同じ意味。つまりrunをつける必要がないもの。

MongoDB

エラー

  • [nodemon] app crashed - waiting for file changes before starting...というエラーが出たが、この前にMongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017というエラーが出ていて、原因は、index.jsのconnectするURLを"mongodb://mongo:27017/Tododb"ではなく、"localhost://mongo:27017/Tododb"にしてしまっていたところにあった。
  • nodeman使っているのに変更がすぐに反映されない。

参照