DevOps/Docker

[Docker] node.js App을 Docker Image로 빌드하기

TTOII 2022. 5. 12. 23:17
728x90

✔️ node.js

Documentation | Node.js (nodejs.org)
두개의 서포트 버전이 존재한다.
LTS : Long Term Support 을 사용한다.

 

✔️ node.js 설치

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

설치를 위해 저장소를 추가후 설치한다.

 vagrant@docker  ~  node --version
v16.15.0

 

✔️ node.js App 개발 환경 준비

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
 vagrant@docker  ~  mkdir node
 vagrant@docker  ~  cd node
 vagrant@docker  ~/node  mkdir web
 vagrant@docker  ~/node  cd web

 

✔️ node.js App 실행

 vagrant@docker  ~/node/web  vi app.js
 vagrant@docker  ~/node/web  cat app.js
const http = require('http');

const hostname = '0.0.0.0'; # 모든 ip에서 실행 가능하도록 변경
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
 vagrant@docker  ~/node/web  node app.js
Server running at http://0.0.0.0:3000/

node.js App을 실행한다.

 

✔️ node.js App을 Docker Image로 빌드하기

Dockerizing a Node.js web app | Node.js (nodejs.org)

✔️ 파일 구성하기

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", # 메인이되는 js 파일
  "scripts": { 
    "start": "node server.js" # 실행 방법 기술 
  },
  "dependencies": {
    "express": "^4.16.1" # 설치할 외부 패키지 지정
  } # node.js의 web framework
}

server.js

'use strict';

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

 

✔️ npm install

 vagrant@docker  ~/node/web  npm install

added 57 packages, and audited 58 packages in 2s

7 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.5.5 -> 8.10.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.10.0
npm notice Run npm install -g npm@8.10.0 to update!
npm notice

npm install 명령을 내리면 package.json의 dependencies 영역을 참조해서 지정된 패키지를 설치한다.

 vagrant@docker  ~/node/web  ls
node_modules  package-lock.json  package.json  server.json

npm install 하면 package-lock.json 파일이 만들어지는데 이 파일이 패키지 목록을 가지는 파일이다.

해당 파일을 열면 main이 되는 express 패키지가 있고 express 패키지의 의존성 패키지도 모두 설치되어 있다.
package-lock.json 파일과 package.json 파일은 이미지에 넣어줘야 한다.

 

✔️ .dockerignore 파일 구성하기

 vagrant@docker  ~/node/web  ls
node_modules  package-lock.json  package.json  server.json
 vagrant@docker  ~/node/web  vi .dockerignore
 vagrant@docker  ~/node/web  cat .dockerignore
node_modules/
Dockerfile
.dockerignore

node.js는 현재 디렉토리의 node_modules 라는 디렉토리에 패키지를 설치한다.
이 디렉토리는 이미지에는 넣지 않는다.

 

✔️ Dockerfile 작성하기

 vagrant@docker  ~/node/web  vi Dockerfile
 vagrant@docker  ~/node/web  cat Dockerfile
FROM node:16

WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 8080
CMD ["node", "server.js"]

Dockerfile의 RUN, COPY, WORKDIR 명령을 제외하고 순서가 크게 중요하지 않다.

 

✔️ node.js App 이미지 빌드

 vagrant@docker  ~/node/web  docker build -t mynode .

 

✔️ node.js App 이미지로 컨테이너 실행

 vagrant@docker  ~/node/web  docker run -d -p 80:8080 mynode
728x90