-
Notifications
You must be signed in to change notification settings - Fork 1
Docker 이미지가 너무 크다
Seungheon Han edited this page Nov 22, 2024
·
2 revisions
현재 도커 이미지 하나 하나가 다 500MB가 넘으며, media 서버는 거의 1GB에 달하고 있다. 현재 파일 크기가 너무 커서 git action으로 media 서버를 배포하면 빌드하는데만 시간이 5분 이상 걸리고 있다. 때문에 빌드 시간 단축을 위해서 최적화의 필요성을 느꼈다.
멀티 스테이지 빌드는 Docker 이미지를 빌드하는 여러 단계를 나눠, 필요한 파일만 최종 이미지에 포함시키는 방식이다. 각 단계는 독립된 환경을 가지며, 최종 단계는 이전 단계의 결과물만 복사하여 이미지를 생성한다.
- 첫 번째 단계 (빌드)
- 애플리케이션 코드를 컴파일하거나 빌드
- 빌드 도구와 개발 의존성 설치
- 최종 단계 (런타임 단계)
- 빌드 단계에서 생성된 결과물만 복사
- 불필요한 도구나 개발 의존성 제거
- 경량화된 베이스 이미지 사용
- 빌드 도구 및 개발 의존성 제거 빌드 단계에서 필요한 컴파일러, 개발 의존성 들은 최종 실행 단계에서는 필요하지 않다. 따라서 빌드가 끝난 후 최종 이미지는 실행에 필요한 최소한의 파일만 포함한다.
- 중간 파일 제거 빌드 과정에서 생성된 임시 파일, 로그 파일, 캐시 데이터는 최종 실행 단계에서는 필요하지 않다. 멀티 스테이지 빌드를 통해 이러한 불필요한 파일을 제거해줄 수 있다.
- 경량화된 베이스 이미지 사용 최종 실행 단계에서는 애플리케이션 실행에 필요한 최소한의 구성 요소만 포함된 경량 이미지를 사용할 수 있다.
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/main.js"]
위 Dockerfile의 문제점은 다음과 같다.
- 빌드 도구와 개발 의존성이 모두 포함되어 이미지가 무겁다.
- node_modules에 불필요한 파일이 많다.
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
# 실행 단계
FROM node:16-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]
문제점이 있던 Dockerfile에 멀티 스테이지를 적용하면 빌드 단계와 실행 단계를 분리시킬 수 있다. 빌드 단계에서는 빌드 도구와 개발 의존성을 포함한 환경에서 애플리케이션을 빌드하고, 실행 단계에서는 빌드된 결과물과 실행에 필요한 파일들만 가져와 실행 환경을 구성해준다. 이렇게 하면 최종 이미지에서 불필요한 파일과 개발 의존성을 제거할 수 있어 이미지 크기를 대폭 줄일 수 있다.
- Mediasoup 포트 매핑 문제
- swagger 같은 응답 코드에 다양한 응답 보여주기
- Sudo가 계속 비밀번호를 요청함
- Docker 이미지가 너무 크다
- Git action에서 도커 이미지 빌드 시간을 단축시켜보자
- Docker compose를 이용해서 메모리 사용률을 줄여보자
- 방송 녹화 시 CPU 과부하 문제를 해결해보자
- Release 브랜치? 너 필요해?
- 로딩이 너무 짧아…!
- NestJS ORM으로 무엇을 사용해야 할까?
- WebRTC를 이용한 1:N 스트리밍 서비스에서 시그널링 서버가 필요할까?
- 실시간 채팅 구현: 인메모리 방식을 선택한 이유
- MySQL 아키텍처 개선: DB 의존성 분리와 서버 역할 명확화
- 브라우저 창이 최소화되면 비디오 송출이 안된다…!
- Mediasoup 기본 개념
- DLTS와 Signaling
- Tell, Don't Ask (TDA) 원칙이란
- VPC(Virtual Private Cloud) 학습 정리
- 순환참조: A 서비스 ‐ B 서비스 vs. A 서비스 ‐ B 레포지토리
- Dto 메서드 전략
- WebRTC란?
- 자바스크립트 패키지 매니저(npm, yarn, pnpm)
- shadcn/ui을 이용해 UI 개발 생산성 높이기
- React 이벤트 핸들러 네이밍(on vs handle)
- React-router-dom의 createBrowserRouter을 사용해보기
- fetch vs axios