Data-Driven System Development/DocKer

Docker 이미지 빌드 과정과 최적화 방법

Data Jun 2025. 2. 21. 11:11

Docker 이미지가 어떻게 생성되는지를 설명하는 Docker 빌드 과정의 핵심 요소를 시각적으로 나타냅니다. Docker에서 컨테이너를 실행하려면 먼저 이미지(Image) 를 생성해야 하며, 이를 위해 Dockerfile과 Build Context가 필요합니다.

 

 

Docker 빌드 프로세스의 작동 원리

 

1️⃣ Dockerfile을 작성하여 빌드 규칙을 정의
2️⃣ Build Context를 지정하여 Docker가 필요한 파일을 참조
3️⃣ docker build 명령을 실행하면, Dockerfile을 읽고 레이어 기반 이미지가 생성
4️⃣ 생성된 이미지는 Docker Hub 또는 로컬 환경에 저장되며, 컨테이너로 실행 가능

 

# node를 설치한다.
# FROM 베이스 이미지

ARG NODE_VERSION
FROM node:${NODE_VERSION}

# 소스코드를 다운로드 한다.
# COPY [복사할 경로] [붙여넣기 경로]
COPY. /app

# 소스코드의 최상위 디렉토리로 이동한다.
WORKDIR /app

# 소스코드를 실행할 때 필요한 파일을 다운로드한다.
# 소스코드를 빌드한다.
RUN npm ci && npm run build

# 환경 변수를 정의한다.
ENV PORT=3000

# 서버를 실행한다.
ENTRYPOINT ["npm", "run", "start"]

 

해당 Dockerfile은 Node.js 애플리케이션을 컨테이너화하여 실행하는 과정을 설명합니다.
이 과정에서 ARGENV가 사용되었는데, 두 개념의 차이점도 함께 설명하겠습니다.

 

 

  • **ARG**는 빌드 시점에만 사용 가능한 변수를 정의하는 명령어입니다.
  • NODE_VERSION 값을 Docker Build 명령어 실행 시 전달 가능
     
  • FROM node:${NODE_VERSION}에서 사용되며, 빌드할 때 원하는 Node.js 버전을 선택할 수 있음

 

  • ENV는 런타임 환경에서 사용되는 변수를 설정하는 명령어 -> docker run -e PORT=4000 my-app
  • PORT 값을 3000으로 설정하여, 애플리케이션 실행 시 포트를 지정할 수 있음
  • 실행 시 다른 포트를 지정할 수도 있음

 

  • RUN npm ci && npm run build  -> 이 명령은 Docker 이미지 빌드 과정에서 실행됨
  • npm ci를 통해 패키지를 설치하고, npm run build로 소스코드를 빌드 (레이어 추가)
  • 실행 후 해당 결과물이 이미지에 포함됨
  • RUN이 실행된 이후 생성된 새로운 레이어가 캐싱됨 → 다음 빌드 시 불필요한 재실행 방지

 

docker buildx build \
-t kimjunhyungdocker/mbti:embedded-db \
-t kimjunhyungdocker/mbti:latest \
--build -arg NODE_VERSION=20.15.1 \
-f ./Dockerfile \
--pull \
.

이 명령어는 Docker Buildx를 사용하여 Dockerfile을 기반으로 이미지를 빌드하고, 여러 개의 태그를 지정하는 과정입니다.

실행 과정 요약

1️⃣ Docker Buildx를 사용하여 빌드 시작
2️⃣ Dockerfile에서 NODE_VERSION=20.15.1 값 사용 (ARG NODE_VERSION)
3️⃣ 최신 베이스 이미지를 강제 다운로드 (--pull 옵션)
4️⃣ 동일한 빌드 결과물을 embedded-db와 latest 태그로 저장
5️⃣ 현재 디렉터리를 Build Context로 사용하여 빌드 수행

 

📌 결론

  • Docker Buildx를 활용하여 멀티 태그(embedded-db, latest)로 빌드
  • 빌드 시점에서 Node.js 버전을 지정하여 유연한 이미지 빌드 가능
  • 베이스 이미지를 항상 최신으로 유지 (--pull)하여 안전한 빌드 수행