티스토리 뷰

728x90
반응형

NodeJS의 필요성에 대해 살펴본 다음 포스팅에서 우리는 NodeJS가 MSA 환경에 적합한 Runtime 구조 중 하나임을 알게 되었다.

 

WASPRO : NodeJS 어떻게 사용할래?

 

결국 MSA를 설명하는 기조는 바로 클라우드와 귀결되기 때문에 결국 NodeJS가 MSA 환경에 적합하게 동작하기 위해서는 Cloud 기반 Dockerizing이 반드시 함께 수행되어야 할 일이다.

이번 포스팅에서는 바로 NodeJS의 Dockerizing 과정에 대해 살펴보도록 하자.

 package-lock.json 

앞서 다양한 NodeJS 관련 포스팅이 진행되며, Node Module을 설치하기 위해 package.json을 작성하고 npm install을 활용하는 방법에 대해 다루었다.

 

WASPRO : NodeJS NPM

 

package.json에 정의된 Node Module은 npm을 통해 dependency가 자동으로 관리되며, 이는 Global 또는 Local module 디렉토리에 저장된다.

이때 npm 5 이상의 버전으로 npm install을 실행하면, package-lock.json이라는 파일이 함께 생성된다.

D:\NodeJS>npm --version
6.14.6

D:\NodeJS>

다음은 npm install이 동작된 이후 생성된 package-lock.json 파일이다.

package-lock.json은 실제 package.json에 정의된 node module의 dependencies tree를 정의하며, node module을 다른 환경에서 다운로드 받기 위해서는 반드시 필요한 파일이다.

이 파일을 기반으로 Docker 내부에서 npm module을 다운로드 받아 관리한다.

 Docker Image 

1) Dockerfile 작성

해당 파일을 Docker Image로 빌드하기 위해 NodeJS 디렉토리를 Linux에 복사 후 Dockerfile을 작성해 보도록 하자.

# From Base Image
FROM node:12

# Node Directory & Module 구성

WORKDIR /root/NodeJS
COPY package*.json ./
RUN npm install
COPY . .

# NodeJS 기동
EXPOSE 3000
CMD [ "node", "./bin/www" ]

2) Docker build

다음으로 Docker Image를 빌드해 보자. [docker build -t nodejs .]

[root@ciserver NodeJS]# docker build -t nodejs .
Sending build context to Docker daemon 299.5 kB
Step 1/7 : FROM node:12
Trying to pull repository docker.io/library/node ...
12: Pulling from docker.io/library/node
81fc19181915: Pull complete 
ee49ee6a23d1: Pull complete 
828510924538: Pull complete 
a8f58c4fcca0: Pull complete 
33699d7df21e: Pull complete 
923705ffa8f8: Pull complete 
c214b6cd5b8c: Pull complete 
4c73d8285dba: Pull complete 
1c58ef740d94: Pull complete 
Digest: sha256:1e17e0fdecf65b7b86e50875ad5f11ae181a8d0351806babd61b332bc32a2c15
Status: Downloaded newer image for docker.io/node:12
 ---> 1fa6026dd8bb
Step 2/7 : WORKDIR /root/NodeJS
 ---> 05eec6205f3e
Removing intermediate container 40459120c3e3
Step 3/7 : COPY package*.json ./
 ---> a4a55065227d
Removing intermediate container 03fb3c6efcd0
Step 4/7 : RUN npm install
 ---> Running in 74283797debc


> nodemon@2.0.4 postinstall /root/NodeJS/node_modules/nodemon
> node bin/postinstall || exit 0

Love nodemon? You can now support the project via the open collective:
 > https://opencollective.com/nodemon/donate
ㅇㅇ
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: 
fsevents@2.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: 
Unsupported platform for 
fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 356 packages from 254 contributors and audited 358 packages in 7.378s

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

found 0 vulnerabilities

 ---> f3667dafadbb
Removing intermediate container 74283797debc
Step 5/7 : COPY . .
 ---> 851cbcadeacc
Removing intermediate container d73781d72cf3
Step 6/7 : EXPOSE 8080
 ---> Running in f4123392afc3
 ---> 8c4a60755f46
Removing intermediate container f4123392afc3
Step 7/7 : CMD node ./bin/www
 ---> Running in ac492d018c01
 ---> ec197b4328c4
Removing intermediate container ac492d018c01
Successfully built ec197b4328c4
[root@ciserver NodeJS]# 

위와 같이 docker build가 성공하면, 다음과 같이 docker image가 생성된 것을 확인할 수 있다.

[root@ciserver NodeJS]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nodejs              latest              ec197b4328c4        3 minutes ago       956 MB
docker.io/node      12                  1fa6026dd8bb        2 weeks ago         918 MB
[root@ciserver NodeJS]#

 Docker run 

다음으로 생성한 이미지를 기반으로 기동해보도록 하자.

[root@ciserver NodeJS]# docker run -p 3000:3000 -d --name nodejs nodejs 
6fbc86e60d5cfe1920bb81b22a08c01753153fc5223cc333a72a73ca78d0c476
[root@ciserver NodeJS]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED            
STATUS              PORTS                              NAMES
6fbc86e60d5c        nodejs              "docker-entrypoint..."   7 minutes ago       Up 7 minutes        0.0.0.0:3000->3000/tcp, 8080/tcp   nodejs
[root@ciserver NodeJS]# 

docker run -p [hostnode_port]:[container_port] -d --name [container_name] [image_name] 형태로 기동한다.

기동이 완료되면 다음과 같이 Page를 호출해 보도록 하자.

위와 같이 NodeJS 기반 환경이 Docker Image로 기동되었으며, 호출까지 진행해 보았다.

마지막으로 Docker log를 통해 node 기반 호출이 정상적으로 이루어졌는지 확인해 보자.

[root@ciserver NodeJS]# docker logs -f nodejs
GET / 200 22.406 ms - 2089
GET /stylesheets/style.css 200 3.593 ms - 1780

 결론 

지금까지 NodeJS 기반 Docker Image 생성 및 기동 방법에 대해 살펴보았다.

마지막으로 생성과정을 되짚어 보도록 하자.

 

1) package-lock.json 파일 생성 (npm install 시 자동 생성됨)

2) Dockerfile 생성

- Node Base Image 기반 Custom Image 생성

- npm module 다운로드

- NodeJS Project COPY

- 기동 CMD 작성

3) docker build

4) docker run

5) page call

 

NodeJS을 이미지로 생성하는 과정은 일반 Docker Image를 생성하는 과정과 크게 다르지 않다.

이와 같이 NodeJS 기반으로 생성된 Docker Image를 Kubernetes와 같은 Container Management Platform 기반으로 기동하여 확장성 있게 관리해 나갈 수 있다.

728x90
반응형