Node.js 기반 Docker Image 만들기 - 1

Node.js 기반 Docker Image 만들기 - 2 (이 글)

Node.js 기반 Docker Image 만들기 - 3

 

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

 

이번에는 앞서 만든 애플리케이션을 가지고 도커 이미지를 만드는 작업을 해요

 

도커 이미지가 무엇인지는 다음에 알아봐요

 

Dockerfile이라는 파일을 만들고 아래 내용을 추가해주세요

FROM node:12

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

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

RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --only=production

# 앱 소스 추가
COPY . .

EXPOSE 8080
CMD [ "node", "index.js" ]

 

nodejs 공식 홈페이지에 나와있는 주석이 너무 훌륭해서 더 붙이는게 사족이 될 것 같지만 간단하게 덧붙이자면

 

WORKDIR는 working directory를 설정하는데 이 뒤로 나오는 RUN, CMD, ENTRYPOINT, COPY, ADD 명령어들은 다 이 WORKDIR에서 실행돼요. 그리고 Base Image 안에 WORKDIR로 지정한 경로의 폴더가 없다면 그 폴더를 얘가 만들어줘요. WORKDIR은 하나의 Dockerfile 안에서 여러번 실행될 수 있는데 상대경로와 절대경로 모두 사용할 수 있어요. 위 예제에서 WORKDIR /usr/src/app 이라고 하고 COPY . . 전에 WORKDIR app2 라고 썼다면 COPY . .이 실행되는 곳의 경로는 /usr/src/app/app2/ 가 돼요.

 

COPY package*.json ./는 Dockerfile이 있는 위치에서 package로 시작하는 json 파일들을 전부 다 WORKDIR로 복사해줘요

 

RUN npm install은 WORKDIR에서 npm install을 실행해줘요. 해주는데..

package*.json이 있는 상태에서 npm install을 실행하면 그 안에 있는 내용을 보고 필요한 패키지들을 node_modules 폴더에 설치해요. 설치한 패키지들이 많으면 이 폴더가 커질 수 있는데 도커 이미지 사이즈를 최대한 작게 하기 위해 이미지를 만들 때 부터 넣어놓지 않고 컨테이너를 생성할 때 패키지 설치를 하게 해요. RUN 명령어와 CMD 명령어는 다음에 자세하게 보아요.

 

EXPOSE 8080은 이 도커 이미지로 만든 컨테이너가 기본적으로 8080포트를 열고있다고 도커에게 알려주는 거에요. 기본은 TCP이고 따로 UDP인지 TCP인지 알려주는 것도 가능해요.

 

.dockerignore 라는 파일도 만들어주세요. 앞에 ( . )이 붙어있는 거 중요해요. 아래 내용을 추가해주세요.

node_modules
npm-debug.log

 

로컬에 있는 node_modules라는 폴더를 이미지로 복사해서 덮어쓰지 않게 하고 npm-debug.log 파일도 이미지 파일 안으로 복사되는 것을 막아줘요. .dockerignore 파일이 하는 일이 이런 거에요 자세한 건 다음에 알아봐요.

 

마지막으로 아래 명령어를 실행하면 진짜 도커 이미지가 만들어지게돼요. 그리고 docker image ls 혹은 docker images 명령어로 확인해보세요.

docker build . -t <your username>/node-web-app:1.0.0
docker image ls

 

docker build에서 ( . ) 빼먹지 않도록 주의해요. -t 옵션은 name:tag 형식으로 이미지 이름과 태그를 넣어주는 옵션이에요. 이번에 만든 이미지는 버전 1.0.0이다. 라고 말해주는 거에요. 

 

 

 

Node.js 기반 Docker Image 만들기 - 3에서 계속