Frontend Dockerfile 작성하기

김재혁·2025년 2월 7일

공통 프로젝트

목록 보기
4/12

Frontend Dockerfile 작성

0. 전체 코드

(1)

# Stage 1: React 앱 빌드
	
# Node LTS 버전 사용
FROM node:22.13-alpine AS builder

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일을 먼저 복사해서 캐시 활용
COPY package.json package-lock.json ./

# 의존성 설치
RUN npm ci --omit=dev

# 전체 소스 복사
COPY . .

# React 빌드
RUN npm run build


# Stage 2: Nginx로 정적 파일 서빙

# NGINX LTS 버전 사용
FROM nginx:1.26-alpine

# Nginx 설정 복사
COPY nginx-front.conf /etc/nginx/nginx.conf

# React 빌드 산출물 복사
COPY --from=builder /app/build /usr/share/nginx/html

# 포트 노출
EXPOSE 80

# NGINX 실행
CMD ["nginx", "-g", "daemon off;"]

1. Stage 1: React 앱 빌드

(1) 베이스 이미지 선택 및 스테이지 이름 지정

FROM node:22.13-slim AS builder
  • node:22.13-alpine: Node.js LTS 버전 중 하나인 22.13의 알파인(alpine) 버전을 사용합니다.
  • AS builder: 이 빌드 스테이지에 builder라는 이름을 붙여서, 나중에 다른 스테이지에서 이 스테이지의 결과물을 참조할 수 있게 합니다.

(2) 작업 디렉토리 설정

WORKDIR /app
  • 컨테이너 내에서 /app 디렉토리를 작업 디렉토리로 설정합니다. 이후의 모든 명령어는 이 디렉토리 내에서 실행됩니다.

(3) 의존성 파일 복사

COPY package.json package-lock.json ./
  • package.jsonpackage-lock.json 파일을 컨테이너의 현재 작업 디렉토리(/app)로 복사합니다.
  • 이 작업을 먼저 수행하는 이유는, 의존성 설치(npm install)가 소스 코드 전체가 아니라 이 파일들만 변경될 때만 재실행되어 캐시 활용이 가능하게 하기 위함입니다.

(4) 의존성 설치

RUN npm ci --omit=dev
  • 프로젝트의 의존성들을 설치합니다. package-lock.json을 기반으로 라이브러리들을 다운로드하고 설치합니다.
  • --omit=dev 옵션 추가 → 개발용 패키지(devDependencies) 제외 → 최종 컨테이너 크기 감소

(5) 전체 소스 복사

COPY . .
  • 프로젝트의 나머지 소스 코드를 모두 컨테이너로 복사합니다.
  • 이렇게 하는 이유는, 의존성 설치 후에 실제 애플리케이션 코드를 복사함으로써 캐시 효율성을 높이기 위함입니다.

(6) React 빌드 실행

RUN npm run build
  • React 애플리케이션을 빌드합니다.
  • 이 명령어는 보통 build 폴더에 최적화된 정적 파일(html, css, js 등)을 생성합니다.

2. Stage 2: Nginx를 통한 정적 파일 서빙

(1) Nginx 베이스 이미지 선택

FROM nginx:1.26-alpine
  • nginx:1.26-alpine: 가벼운 Alpine Linux 기반의 Nginx LTS 버전을 사용합니다.
  • 빌드 결과물만을 서빙하기 때문에 Node.js가 필요 없고, 대신 웹 서버인 Nginx를 사용하여 정적 파일을 빠르게 제공할 수 있습니다.

(2) Nginx 설정 파일 복사 (선택사항)

COPY nginx-front.conf /etc/nginx/nginx.conf
  • 커스텀 Nginx 설정 파일(nginx-front.conf)을 컨테이너 내의 기본 설정 파일 위치(/etc/nginx/nginx.conf)로 복사할 수 있습니다.

(3) React 빌드 산출물 복사

COPY --from=builder /app/build /usr/share/nginx/html
  • --from=builder 옵션을 사용하여, 이전 스테이지(builder)에서 생성된 /app/build 폴더를 현재 스테이지의 /usr/share/nginx/html 디렉토리로 복사합니다.
  • Nginx는 기본적으로 /usr/share/nginx/html 폴더의 파일들을 서빙하므로, 이 작업을 통해 빌드된 React 앱이 Nginx에 의해 제공됩니다.

(4) 포트 노출

EXPOSE 80
  • 컨테이너가 80번 포트를 사용함을 명시합니다.
  • 이 포트는 HTTP 기본 포트로, 외부에서 접근할 때 사용됩니다.

(5) Nginx 실행

CMD ["nginx", "-g", "daemon off;"]
  • 컨테이너가 시작될 때 Nginx를 실행합니다.
  • daemon off; 옵션은 Nginx가 포그라운드(foreground)에서 실행되도록 하여, Docker 컨테이너가 계속 실행 상태를 유지하도록 합니다.
profile
志鐵心鏡

0개의 댓글