Sprint – 연습: Node.js 웹 앱 컨테이너화

► 간단한 Node.js 정리

Node.js: JavaScript를 사용하여 서버 측 프로그램을 만들기 위한 플랫폼

npm init : package.json 파일 생성 명령어

package.json : 프로젝트 정보를 정의하고 프로젝트에서 사용하는 모듈 및 라이브러리의 종속성을 관리하는 데 필요한 정보를 포함합니다.
npm install : 필요한 모듈을 설치하는 명령

필요한 모듈을 설치하려면 package.json 파일 읽기 > package.json 파일 필요

Express.js: Node.js용 웹 프레임워크


► 간단한 Node.js 웹 애플리케이션을 생성한 후 이를 위한 Docker 이미지를 생성하고 컨테이너로 실행합니다.

1. Node.js 앱 만들기
▹ 디렉토리 생성 > 애플리케이션과 종속성을 알려주는 package.json 파일을 만듭니다.

{
  "name": "docker_web_app",     // 패키지의 이름
  "version": "1.0.0",           // 패키지의 버전
  "description": "Node.js on Docker",  // 패키지의 설명
  "author": "First Last <[email protected]>", // 패키지 작성자
  "main": "server.js",          // 패키지의 주요 파일
  "scripts": {                  
    "start": "node server.js"   // npm start 명령을 실행할 때 실행할 스크립트
  },
  "dependencies": {             // 패키지의 의존성 모듈 목록
    "express": "^4.16.1"        // express 모듈과 버전 정보
  }
}

2. npm 설치 실행

3. Express.js 프레임워크로 웹 앱을 정의하는 server.js를 생성합니다.

'use strict';

// express 모듈 불러오기
const express = require('express');

// 상수
const PORT = 8080;  // 포트 번호
const HOST = '0.0.0.0';  // 호스트 주소

// 앱
const app = express();  // Express 앱 인스턴스 생성
app.get('/', (req, res) => {  // HTTP GET 요청에 대한 라우터 등록
  res.send('Hello World');  // 응답으로 'Hello World' 문자열 전송
});

// HTTP 서버 실행
app.listen(PORT, HOST, () => {
  console.log(`Running on http://${HOST}:${PORT}`);  // 서버 시작 로그 출력
});

4. Dockerfile 빈 파일 생성
▹ 윈도우: 새 항목 -ItemType 파일 도커파일

5. Dockerfile을 열고 내용을 입력하십시오.

FROM node:16 # Docker Hub에 있는 node의 최신 LTS(장기 지원) 버전인 16을 사용

# 앱 디렉터리 생성
WORKDIR /usr/src/app # 애플리케이션의 작업 디렉터리

# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./ # 현재 디렉토리에서 package.json이나 package-lock.json 파일을 모두 복사

RUN npm install # 앱 의존성 설치
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --omit=dev

# 앱 소스 추가
COPY . . # 현재 호스트 머신의 모든 파일과 디렉터리를, 도커 이미지 내부의 현재 작업 디렉터리로 복사

# 컨테이너를 실행시 실행
EXPOSE 8080 # 도커 컨테이너 포트 8080번
CMD ( "node", "server.js" ) # node server.js 명령어가 실행
# server.js 파일이 Node.js로 실행되며, 8080번 포트로 들어오는 HTTP 요청을 처리

6. dockerfile과 동일한 디렉터리에 .dockerignore 파일을 생성합니다.

.dockerignore : Dockerfile에 복사할 필요가 없는 파일 또는 디렉터리를 지정하는 파일입니다.

Docker 이미지 크기를 줄일 수 있습니다.

node_modules # Node.js 애플리케이션에서 사용되는 패키지들이 설치되는 디렉토리
			 # 로컬 컴퓨터에서 의존성 패키지를 설치했으므로, 도커 이미지 빌드 시에 다시 설치할 필요가 없음
npm-debug.log # npm 명령어를 실행할 때 발생하는 디버그 로그

7. Dockerfile이 있는 디렉터리 > Docker 이미지 빌드(아래 명령 입력)

docker build . -t <your username>/node-web-app

8. Docker 이미지 확인

$ docker images

# 예시
REPOSITORY                      TAG        ID              CREATED
node                            16         1934b0b038d1    5 days ago
<your username>/node-web-app    latest     d64d3505b0d2    1 minute ago

9. 이미지 실행

docker run -p 49160:8080 -d <your username>/node-web-app

10.

# 컨테이너 아이디를 확인합니다
$ docker ps

# 앱 로그를 출력합니다
$ docker logs <container id>

# 예시
Running on http://localhost:8080

11. 앱 테스트: Docker 매핑된 앱 포트 확인

$ docker ps

# 예시
ID            IMAGE                                COMMAND    ...   PORTS
ecce33b30ebf  <your username>/node-web-app:latest  npm start  ...   49160->8080
# 위 예시에서 Docker가 컨테이너 내의 8080 포트를 머신의 49160 포트로 매핑했습니다.

12. http://127.0.0.1:49160 에 접속하여 서비스가 잘 되는지 확인