Dockerizing a Node.js

SimDdong·2020년 7월 16일
0

Node.js CI/CD

목록 보기
1/2
post-thumbnail

Node.js 프로그램을 도커 이미지로 빌드하기

이 포스팅은 Docker 및 Node.js 기본지식이 있다는 가정하에 작성되었습니다.
위 시리즈를 순서대로 보는 것을 추천합니다.

예제 프로젝트 깃허브: Example Dockerizing Express Github

Dockerfile 구성

빌드되는 Docker 이미지는 위와 같은 구성입니다.

명령어를 구성을 할때 중요한 점이 Docker의 Cache 기능을 최대한 활용하여 빌드 속도를 빠르게 하고 용량을 줄이는 것입니다.

아래는 각 이미지의 역할을 설명합니다. (빌드에 필요한 모듈은 devDependencies로 분리)

Base
Base 이미지는 빌드 및 실행에 쓸 기본적인 Node 환경을 구성

  • Alpine 리눅스에 Node가 탑재된 node-alpine 이미지를 사용
  • Node는 이미 설치되어있기에 기타 부가적으로 필요한 패키지를 설치
  • 작업을 할 폴더를 구성
  • 로컬에서 package.json 복사

Dependensies
Dependensies 이미지는 Base 이미지 기반으로 빌드 및 실행에 쓰일 Node Modules을 설치

  • package.json에 구성된 dependencies를 우선 설치
  • dependencies를 다른 폴더에 복사
  • 이미 dependencies가 설치 됬기에 devDependencies 항목만 설치

Build
Build 이미지는 Dependensies 이미지 기반으로 소스코드 빌드

  • 빌드에 필요한 설정파일 및 소스코드 복사
  • 빌드 명령어 실행

Release
Release 이미지는 base 이미지 기반으로 빌드파일을 실행

  • Build Args 설정 및 환경변수 설정
  • Dependensies 이미지에서 devDependencies를 제외한 dependencies만 복사
  • 빌드에 필요한 설정파일 및 소스코드 복사
  • 환경변수에 맞는 빌드 명령어 실행

Dockerfile 예제

# ---- Base ----
FROM node:12.16.1-alpine AS base
# install os package
RUN apk add --no-cache make gcc g++ python
# set working directory
RUN mkdir /example-dockerizing-express
WORKDIR /example-dockerizing-express
# copy project file
COPY package.json .

# ---- Dependencies ----
FROM base AS dependencies
# install node modules
RUN npm set progress=false && npm config set depth 0
RUN npm install --only=production
# copy production node_modules aside
RUN cp -R node_modules prod_node_modules
# install all node_modules, including 'devDependencies'
RUN npm install

# ---- Builder ----
FROM dependencies AS builder
COPY --from=dependencies /example-dockerizing-express/node_modules ./node_modules
COPY ./.babelrc ./.babelrc
COPY ./lib ./lib
COPY ./test ./test
RUN npm run build
RUN npm run test

# ---- Release ----
FROM base AS release
# set env
ARG NODE_ENV
ENV NODE_ENV=${NODE_ENV}
# copy production node_modules
COPY --from=dependencies /example-dockerizing-express/prod_node_modules ./node_modules
# copy app sources
COPY --from=builder /example-dockerizing-express/dist ./dist
# expose port and define CMD
EXPOSE 3000
CMD ["sh", "-c", "npm run start:${NODE_ENV}"]

Dockerfile Build

본 게시글 상단의 예제 프로젝트로 진행합니다.
물론 Docker 명령어는 기본적으로 숙지하셔야합니다.

# 예제 프로젝트 Clone
git clone https://github.com/sdg9670/example-dockerizing-express.git

# 프로젝트 폴더 이동
cd example-dockerizing-express

# 예제 프로젝트 경로에서 아래의 명령어를 알맞게 입력한 후 실행합니다.
# NODE_ENV: dev, test, production
docker build --build-arg NODE_ENV=옵션 -t 이미지이름 .

# 3000포트를 바인딩 후 이미지를 컨테이너로 실행합니다.
docker run -p 3000:3000 --name 컨테이너이름 이미지이름

위 명령어를 실행하신 후 http://localhost:3000/ 에 접속하시면 본인이 설정한 NODE_ENV를 출력할 것입니다.

성공적으로 빌드되고 실행된 것을 확인할 수 있습니다.

이렇게 되면 생성된 이미지로 언제든 컨테이너를 생성할 수 있습니다.

다음 포스팅: Docker & Jenkins 구성 및 자동배포

0개의 댓글