최적화 전 상태#
일반적인 Node.js 애플리케이션의 도커파일은 다음과 같다.
1
2
3
4
5
| FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
|
이 이미지의 크기는 1GB를 넘는다. 주된 원인은 다음과 같다:
- 무거운 베이스 이미지
- 개발 도구 포함
- 불필요한 파일 존재
- 캐시 파일 누적
최적화 기법#
1. 멀티 스테이지 빌드 적용#
빌드 단계와 실행 단계를 분리한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 빌드 스테이지
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 실행 스테이지
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm install --production
CMD ["npm", "start"]
|
2. 알파인 리눅스 사용#
알파인 리눅스는 기본 이미지 크기를 크게 줄인다.
1
2
3
4
5
| # 나쁜 예: node:18 (~1GB)
FROM node:18
# 좋은 예: node:18-alpine (~120MB)
FROM node:18-alpine
|
3. 프로덕션 의존성만 포함#
개발 의존성을 제외한다.
1
2
3
4
5
| # 나쁜 예
RUN npm install
# 좋은 예
RUN npm ci --only=production
|
4. 불필요한 파일 제거#
.dockerignore 파일을 사용한다.
node_modules
.git
.vscode
*.log
tests
docs
5. 레이어 최적화#
명령어를 결합하여 레이어 수를 줄인다.
1
2
3
4
5
6
7
8
9
| # 나쁜 예
RUN apk update
RUN apk add python3
RUN rm -rf /var/cache/apk/*
# 좋은 예
RUN apk update && \
apk add python3 && \
rm -rf /var/cache/apk/*
|
실제 적용 사례#
Node.js 웹 애플리케이션#
최적화 전:
1
2
3
4
5
| FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
|
이미지 크기: 1.2GB
최적화 후:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production && \
npm cache clean --force
CMD ["npm", "start"]
|
이미지 크기: 120MB
Go 애플리케이션#
최적화 전:
1
2
3
4
5
| FROM golang:1.16
WORKDIR /app
COPY . .
RUN go build -o main .
CMD ["./main"]
|
이미지 크기: 850MB
최적화 후:
1
2
3
4
5
6
7
8
9
10
| FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
FROM scratch
COPY --from=builder /app/main .
CMD ["./main"]
|
이미지 크기: 15MB
Python 웹 애플리케이션#
최적화 전:
1
2
3
4
5
6
| FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
|
이미지 크기: 900MB
최적화 후:
1
2
3
4
5
6
7
8
9
10
11
12
| FROM python:3.9-alpine AS builder
WORKDIR /app
COPY requirements.txt .
RUN apk add --no-cache gcc musl-dev && \
pip install --user -r requirements.txt
FROM python:3.9-alpine
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
|
이미지 크기: 100MB
성능 영향#
이미지 크기 감소는 다음과 같은 이점을 제공한다:
- 배포 시간 단축
- 네트워크 대역폭 절약
- 컨테이너 시작 시간 감소
- 스토리지 비용 절감
- 보안 취약점 감소
이미지 최적화는 지속적인 과정이다. 새로운 버전이 릴리스될 때마다 최적화 기법을 적용하고 결과를 측정한다. 이는 운영 비용 절감과 시스템 성능 향상으로 이어진다.