다음은 Node.js 공식 문서에서 node 및 express를 이용해 단순한 앱을 컨테이너화 하는 튜토리얼입니다.  아직 앞에 학습한 내용들을 미처 정리하지 못했지만 오늘처럼 직접 해보면서 학습하는 경우엔 앱을 또 만들어야 하는 상황이 생기지 않도록 바로바로 블로그에 정리하려 합니다.  아래는 Node.js 공식 문서의 도커라이징 링크입니다. 

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp

 

Node.js 웹 앱의 도커라이징 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org


Node.js 앱 만들기

먼저 Application, 의존성을 알려주는 package.json 파일을 아래와 같이 생성하도록 합니다.

<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": "node server.js"
    },
    "dependencies": {
        "express": "^4.16.1"
    }
}

 위와 같이 작성이 끝났으면 저장 후 터미널에서 npm install을 통해 모듈들을 설치해 줘야겠죠?

npm install을 통해 필요한 모듈들을 설치해 줍시다!

 


다음은 server.js 파일입니다.

<server.js>

"use strict";

const express = require("express");

// 상수
const PORT = 3000;
const HOST = '0.0.0.0';
// 앱
const app = express();
app.get("/", (req, res) => {
    res.send("Hello Guys~");
});

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

그리고 dockerfile 파일을 생성합니다.

<dockerfile>

FROM node:16

# 앱 디렉터리 생성
WORKDIR /usr/src/app

# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./

RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우에 아래 코드.
# RUN npm ci --only=production -> npm ci 커맨드는 프로덕션 환경을 위한 더 빠르고 신뢰할 수 있고 재현 가능한 빌드를 제공. 

# 앱 소스 추가 => 이미지 내 앱 소스코드를 넣기 위해 COPY 지시어를 사용.
COPY . .
# 앱이 3000포트에 바인딩 되어 있으므로 EXPOSE를 사용해 docker 데몬에 맵핑.
EXPOSE 3000  
# 서버를 구동하도록 명령어 'node server.js'를 실행.
CMD [ "node", "server.js" ]

 


그리고 다음 명령어를 해당 디렉터리 안에서 입력하여 이미지를 빌드해 줍니다. *유저 이름은 dockerhub계정 이름입니다.

docker build . -t <유저이름>/node-web-app

도커 Images를 보면 이미지가 업로드되어 있습니다. 터미널에서 확인하는 방법은 터미널에서 docker images를 입력하면 됩니다.


다음은 컨테너의 3000번 포트를 local의 5000번 포트로 매핑하는 코드입니다.

docker run -p 5000:3000 -d <유저 이름>/node-web-app


-d 옵션은 데몬으로 실행하는 옵션(백그라운드에서 실행합니다).

-p 옵션은 호스트, 컨테이너의 포트를 연결해 주는 옵션입니다.

 

컨테이너 내부는 3000번 포트로 위 앱이 실행되고 있고 호스트의 5000번 포트에 이것을 매핑하여 localhost:5000으로 접근하면 컨테이너 3000번 포트에서 실행되는 프로그램을 볼 수 있도록 하는 것입니다.

위는 생성된 컨테이너를 확인하는 창입니다.



이제 localhost:5000으로 접속하면 다음과 같이 결과를 얻을 수 있습니다.

 

후.. 처음엔 공식문서를 따라 하다가 블로그를 참고하며  docker 실습을 해보았는데 그냥 끝까지 공식문서를 따라 할걸 그랬습니다.. 계속 image와 container를 정상적으로 만들었음에도 오류가 나서 처음부터 공식문서를 따라 다시 만들다 보니 도중에 터미널 명령어를 입력하는 과정에서 실수를 해서 그랬단 걸 너무 늦게 깨달아버렸다는.. ㅜㅜ
그리고 블로그들에 나와있는 코드와 현 공식 문서의 코드가 미미한 차이가 있더라고요. 역시 문서를 보는 걸 버릇화 해야겠습니다 ㅎㅎ 

 

+ Recent posts