[Docker] 이미지, 빌드 시간 최적화

parkjh9370·2022년 8월 18일
0

Dockerfile 최적화 요소

  1. 이미지 용량 최소화
  • 도커는 컨테이너 실행 레이어를 축적하여 이미지를 생성하고, 한 번 생성된 레이어는 제거 할 수 없다.
  • 배포에 필요한 파일만 남겨둠으로 써 해당 컨테이너 이미지의 용량을 최소화 할 수 있다.
    ex) dist, node_modules (Node.js)

case 1) 명령어 실행을 통해 파일 제거
RUN ["/bin/sh", "-c", "find . ! -name dist ! -name node_modules -maxdepth 1 -mindepth 1 -exec rm -rf {} \\\\;"]

case 2) 빌드 과정 후 필요한 파일만 복사하여 컨테이너 실행
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules


  1. 빌드 시간 최적화 (레이어 캐싱)
  • 도커는 이미지를 만들 때 각 명령어마다 Layer를 만들어두고 이전과 변한 것이 없을 경우 재사용 한다.

  • 각 파일마다 가지고 있는 역할을 세분화하여 각 레이어를 생성함으로써 소스 코드 수정 시 재 빌드 시간 단축시킬 수 있다.

  • 이를 나누지 않을 경우 코드를 단 한 줄도 바꾸지 않아도 매번 패키지를 설치하고 빌드를 실행하기 때문에, CPU, 메모리 자원을 낭비할 수 있다.

ex) 다음과 같은 과정으로 Layer를 관리해 줄 수 있다.

# Depndencies 설치 환경 (deps)
FROM node:16-alpine AS deps 
~~~

#Build(dist) 파일 생성 (builder), 그 외 서버 실행(runner)에 필요없는 파일은 모두 제거
FROM node:16-alpine AS builder
~~~

# 서버 실행 (runner)
FROM node:16.16.0 AS runner
~~~

  1. 컨테이너 내부 프로세스 수 줄이기
  • npm run start와 같은 명령어를 사용 시 해당 명령어가 node를 실행하고, 다시 node가 다시 그 결과물을 실행하게 되어 실행중인 프로세스 수는 2개 이상
  • node dist/main 과 같이 서버 실행 시 필요한 명령어만 사용함으로써 사용중인 프로세스를 줄여 메모리를 최적화하여 사용할 수 있음

-> npm run start 프로세스: 3개

-> node dist/src/main 프로세스: 1개

( 해당 내용 원리는 https://spartacodingclub.kr/blog/optimizing-dockerfile 참고)


최종 적용 코드

Dockerfile

# Dpendencies 설치 환경 (deps)
FROM node:16-alpine AS deps
WORKDIR /app
COPY ["package.json", "yarn.lock", "./"]
RUN ["yarn", "install"]

# Build(dist) 파일 생성 (builder)
FROM node:16-alpine AS builder
WORKDIR /app
COPY ["tsconfig.build.json", "tsconfig.json", "./"]
COPY ["src/", "./src/"]
COPY --from=deps /app/node_modules ./node_modules
RUN ["npx", "nest", "build"]

# 서버 실행 (runner) - node_modules, dist 파일만 복사
FROM node:16.16.0 AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main"]

EXPOSE 8000

🔎 해당 Dockerfile을 통해 동일한 프로젝트 테스트 결과, 서버 실행 (runner) 과정에서node:16-alpine 버전을 사용했을 때 용량이 엄청 줄어드는 걸 확인할 수 있었다.

  • alpine 버전
    - 적용 전: 1.48GB -> 적용 후: 344.23M

  • node:16.16.0 버전
    - 적용 전: 1.48GB -> 적용 후: 1.08GB


🙏🏻 참고

0개의 댓글