🌐

docker-compose & node.js 開発環境構築

2022/03/15に公開

対象者

  • docker-compose を使って node.js の開発環境を作りたい方.
  • 開発環境を docker のコンテナを用いて運用したい方.

ディレクトリ構成

nodejs-sampleディレクトリの中身はこんな感じです.

/nodejs-sample
.
├── .dockerignore
├── docker-compose.yaml
├── package.json
└── src
    └── server.js

各ファイル

.dockerignore
node_modules
npm-debug.log
docker-compose.yaml
version: "3.7"
services:
    app:
      image: node:16.14.0
      working_dir: /usr/src/app
      tty: true
      ports: 
      - '3000:3000'
      volumes:
        - ./:/usr/src/app
      command: >
        bash -c "npm install &&
        npm install nodemon -g &&
        nodemon src/server.js"
package.json
{
    "name": "docker_web_app",
    "version": "1.0.0",
    "description": "Node.js on Docker",
    "author": "First Last <first.last@example.com>",
    "main": "server.js",
    "scripts": {
        "start": "nodemon src/server.js"
    },
    "dependencies": {
        "express": "^4.16.1"
    }
}
server.js
'use strict';

const express = require('express');
// Constants
const PORT = 3000;
const HOST = '0.0.0.0';
// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World succeeded request');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

実行

ログが見れるのでこちらの方が分かりやすい.

terminal1
$ docker-compose up
[+] Running 2/2
 ⠿ Network nodejs-sample_default  Created                                                                          0.7s
 ⠿ Container nodejs-sample-app-1  Created                                                                          1.3s
Attaching to nodejs-sample-app-1

nodejs-sample-app-1  | added 62 packages, and audited 63 packages in 1s
nodejs-sample-app-1  |
nodejs-sample-app-1  | 2 packages are looking for funding
nodejs-sample-app-1  |   run `npm fund` for details
nodejs-sample-app-1  |
nodejs-sample-app-1  | found 0 vulnerabilities
nodejs-sample-app-1  | npm notice
nodejs-sample-app-1  | npm notice New minor version of npm available! 8.3.1 -> 8.5.4
nodejs-sample-app-1  | npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.5.4
nodejs-sample-app-1  | npm notice Run npm install -g npm@8.5.4 to update!
nodejs-sample-app-1  | npm notice

nodejs-sample-app-1  | added 116 packages, and audited 117 packages in 4s
nodejs-sample-app-1  |
nodejs-sample-app-1  | 16 packages are looking for funding
nodejs-sample-app-1  |   run `npm fund` for details
nodejs-sample-app-1  |
nodejs-sample-app-1  | found 0 vulnerabilities
nodejs-sample-app-1  | [nodemon] 2.0.15
nodejs-sample-app-1  | [nodemon] to restart at any time, enter `rs`
nodejs-sample-app-1  | [nodemon] watching path(s): *.*
nodejs-sample-app-1  | [nodemon] watching extensions: js,mjs,json
nodejs-sample-app-1  | [nodemon] starting `node src/server.js`
nodejs-sample-app-1  | Running on http://0.0.0.0:3000
terminal2
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                    NAMES
ebf3eac5d27d   node:16.14.0   "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   0.0.0.0:3000->3000/tcp   nodejs-sample-app-1
$ docker exec --it nodejs-sample-app-1 bash
root@ebf3eac5d27d:/usr/src/app# ls
docker-compose.yaml  node_modules  package-lock.json  package.json  src
root@ebf3eac5d27d:/usr/src/app# npm install mysql

デーモンで実行する場合は下

$ docker-compose up -d

後片付け

$ docker-compose down

補足説明

docker-compose.yaml について

docker-compose.yamlファイルのcommandの部分説明します.

docker-compose.yaml - command
command: >
        bash -c "npm install &&
        npm install nodemon -g &&
        nodemon src/server.js"

npm installpackage.jsonpackage-lock.json の中身をコンテナ内にinstall
npm install nodemon -g でコンテナ内で nodemon が使えるようになります.
nodemon src/server.js で実行.

nodemon をなぜ使うか.
nodemonを使わなければ nodemon src/server.jsnode src/server.js になります.
しかし,server.js の中身を書き換えたり,新しいmoduleをnpm install した場合は再度, node src/server.js する必要があります.開発環境でそれは怠いのでnodemonを使用します.こいつは便利で,ファイルの中身を書き換えたり,モジュールを追加したときは自動で再起動してくれます.開発環境では使うべきでしょう.他に何か同様なものを知っているならば使わなくて結構です.

terminal2 について

docker-compose で立てたコンテナ内に入る処理の例として受け取ってください.
npm install module_name とかは,コンテナの中で行います.

Discussion