본문 바로가기

잡부생활/Container

도커컴포즈로 node.js 환경 구성하기

VScode를 이용해서 간단한 node 샘플 app.js을 생성한다.

먼저 node init을 통해 package.json을 생성한다. 사용하는 lib는 express, nodemon 이다.

{
  "name": "nodeindocker",
  "version": "1.0.0",
  "description": "node express app in docker",
  "main": "app.js",
  "dependencies": {},
  "devDependencies": {
    "express": "^4.17.1",
    "nodemon": "^1.19.4"
  },
  "scripts": {
    "start": "node app.js"
  },
  "author": "leedoing",
  "license": "ISC"
}

 

샘플 node 서버 스크립트를 구성한다.

const express = require('express');
const app = express();
app.get('/', (req, res)=>{
    res.send('Hello from express app')
})
const port = process.env.PORT || 8080;
app.listen(port, () =>{
    console.log(`App is listening on ${port}`)
});

 

다음은 아래와 같이 docker-compose.yml 파일을 이용하여 express 컨테이너 이미지를 구성한다.

version: '2.3'
services:
  express:
    build: ./
    command: nodemon --inspect=0.0.0.0:5858 app.js
    volumes:
      - ./:/nodeapp
      - /nodeapp/node_modules
    ports:
      - "3000:8080"
      - "5858:5858"

(윈도우의 경우 nodemon -L --inspecct=0.0.0.0:5858 app.js)

 

 

그리고 Dockerfile을 이용해서 컨테이너에서 필요한 커맨드를 입력한다. (node package 관리 등)

FROM node:10.16-alpine
RUN mkdir /nodeapp
WORKDIR /nodeapp
RUN npm i npm@latest -g
RUN npm i nodemon@latest -g
COPY package.json package-lock.json* /nodeapp/
RUN npm install --no-optional && npm cache clean --force
COPY . /nodeapp
CMD ["node", "app.js"]

 

.dockerignore 파일은 아래와 같다. Dockerfile, docker-compose, node_modules을 넣어준다.

*Dockerfile*
*docker-compose*
node_modules

 

이제 터미널에서 docker-compose up을 입력한다. 그럼 아래와 같이 node app 서버가 로컬에서 구동된다.

PS D:\docker-test\nodeindocker> docker-compose up
Starting nodeindocker_express_1 ... done
Attaching to nodeindocker_express_1
express_1  | [nodemon] 1.19.4
express_1  | [nodemon] to restart at any time, enter `rs`
express_1  | [nodemon] watching dir(s): *.*
express_1  | [nodemon] watching extensions: js,mjs,json
express_1  | [nodemon] starting `node --inspect=0.0.0.0:5858 app.js`
express_1  | Debugger listening on ws://0.0.0.0:5858/763871be-fa5e-4d15-954e-0025cdc847ac
express_1  | For help, see: https://nodejs.org/en/docs/inspector
express_1  | App is listening on 8080

 

그럼 브라우저에서 포트포워딩 된 3000번 포트로 접속하면 App.js로 띄운 화면을 볼 수 있다.

Hello Express

 

VScoed의 DEBUG에서 Docker: Atthach to Node를 선택한다.

그리고 아래와 같이 launch.json 추가하면 app.js 파일이 변경될 시 app에 자동 반영된다.

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    
    {
        "type": "node",
        "request": "attach",
        "name": "Docker: Attach to Node",
        "remoteRoot": "/nodeapp",
        "localRoot": "${workspaceRoot}",
        "port": 5858,
        "restart": true
    }
]
}