← 전체 글로 돌아가기

Docker

Docker 이미지가 너무 클 때 줄이는 기준

빌드 후 이미지 크기가 예상과 다르면 불필요한 레이어를 찾아야 한다. 로그와 inspect로 한 층씩 확인한다.

Docker 이미지 크기 문제는 보통 빌드 과정에 불필요한 파일이나 의존성이 남아 있다는 뜻이다. 한 번 너무 커지면 나중에 배포 속도가 현저히 떨어진다.

정상 상태의 이미지 크기를 먼저 기억해두기

이미지가 처음 몇 MB였는데 갑자기 몇 GB가 되는 경우는 없다. 서서히 커진다. 정상이라고 생각되는 크기를 기록해두고, 그보다 크면 뭐가 달라졌는지 찾아야 한다.

# 이미지 크기 확인
docker images

# 더 상세히 보기
docker images --no-trunc --format "table {{.ID}}\t{{.Size}}\t{{.Repository}}"

Dockerfile의 각 레이어 크기 파악하기

Dockerfile의 각 RUN, COPY, ADD 명령어가 이미지 크기에 얼마나 영향을 미치는지 알아야 한다. 큰 패키지를 설치하고 나서 캐시를 정리하지 않으면 그 패키지가 이미지에 남는다.

# 이미지 레이어 상세 조회
docker inspect image-name

# 또는 buildkit 사용 (더 자세한 정보)
DOCKER_BUILDKIT=1 docker build -t my-image . --progress=plain

패키지 매니저 캐시 제거하기

Debian/Ubuntu 기반 이미지라면 apt 캐시가 남아 있을 수 있다. npm, pip 캐시도 마찬가지다. 패키지 설치 후에는 꼭 캐시를 정리해야 한다.

# apt 캐시 제거
RUN apt-get update && apt-get install -y package-name \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# npm 캐시 제거
RUN npm install && npm cache clean --force

빌드 과정의 중간 산물 제거하기

빌드 중에 생기는 임시 파일, 로그, 테스트 파일 등이 이미지에 포함될 수 있다. 멀티 스테이지 빌드를 사용해서 필요한 것만 최종 이미지에 포함시키자.

# 1단계: 빌드
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 2단계: 실행
FROM node:18
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

환경별로 다른 이미지 사용하기

개발 환경용 이미지와 운영 이미지를 다르게 만들 수 있다. 운영 이미지에는 불필요한 개발 도구를 포함시키지 않으면 크기를 크게 줄일 수 있다.

컨테이너 실행 후 남겨진 레이어 확인하기

컨테이너가 생성하는 임시 파일이 레이어에 쌓일 수도 있다. docker ps -a로 종료된 컨테이너를 확인하고 필요없으면 삭제해서 공간을 확보하자.