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 start
でnode index.js
が実行され、npm run dev
でnodemon index.js
が実行されるという意味。実際には、startの方は不要なので、消しても良い。
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
}
- "type"はcommonjsだとimportを標準として、moduleだとrequireを標準としている。
- 上に関して補足で、例外的に
npm start
, npm test
, npm restart
, npm stop
はnpm 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
使っているのに変更がすぐに反映されない。
参照