티스토리 뷰
NodeJS의 필요성에 대해 살펴본 다음 포스팅에서 우리는 NodeJS가 MSA 환경에 적합한 Runtime 구조 중 하나임을 알게 되었다.
결국 MSA를 설명하는 기조는 바로 클라우드와 귀결되기 때문에 결국 NodeJS가 MSA 환경에 적합하게 동작하기 위해서는 Cloud 기반 Dockerizing이 반드시 함께 수행되어야 할 일이다.
이번 포스팅에서는 바로 NodeJS의 Dockerizing 과정에 대해 살펴보도록 하자.
package-lock.json
앞서 다양한 NodeJS 관련 포스팅이 진행되며, Node Module을 설치하기 위해 package.json을 작성하고 npm install을 활용하는 방법에 대해 다루었다.
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 기반으로 기동하여 확장성 있게 관리해 나갈 수 있다.
'⑤ 개발, 데이터베이스 > ⓝ NodeJS' 카테고리의 다른 글
[Node.JS] 이벤트 루프 (0) | 2020.07.19 |
---|---|
[Node.JS] Database 연동 (1) | 2020.07.18 |
[Node.JS] NPM (Node Package Manager) (1) | 2020.07.14 |
[Node.JS] Sample Application (Hello World) (1) | 2020.07.14 |
[Node.JS] Application (app.js & package.json) (0) | 2020.07.13 |
- Total
- Today
- Yesterday
- 마이크로서비스 아키텍처
- jeus
- SWA
- Architecture
- k8s
- nodejs
- MSA
- JEUS6
- webtob
- JBoss
- Da
- wildfly
- OpenStack
- openstack token issue
- SA
- TA
- JEUS7
- 마이크로서비스
- kubernetes
- Docker
- apache
- git
- 오픈스택
- 아키텍처
- node.js
- API Gateway
- 쿠버네티스
- aws
- openstack tenant
- aa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |