Docker 이미지 크기 최적화 방법

DockerBeginner
지금 연습하기

소개

Docker 는 컨테이너 환경에서 애플리케이션을 구축, 배포 및 관리하는 데 널리 사용되는 기술이 되었습니다. 그러나 Docker 이미지의 크기는 애플리케이션 성능, 배포 시간 및 스토리지 요구 사항에 상당한 영향을 미칠 수 있습니다. 이 튜토리얼에서는 Docker 이미지의 크기를 최적화하는 과정을 안내합니다. 기본 개념, 실용적인 기술 및 최상의 관행을 다루어 더 효율적이고 가벼운 컨테이너를 구축하는 데 도움을 드립니다.

Docker 이미지 기본 이해

Docker 이미지란 무엇인가요?

Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적인 실행 가능 패키지입니다. 코드, 런타임, 시스템 도구, 라이브러리 및 설정이 포함됩니다. Docker 이미지는 Docker 컨테이너의 구성 요소이며, Docker 컨테이너는 Docker 이미지의 실행 인스턴스입니다.

Docker 이미지 계층

Docker 이미지는 일련의 계층으로 구성됩니다. 각 계층은 이미지의 Dockerfile 내 명령을 나타냅니다. 이러한 계층은 최종 이미지를 형성하도록 서로 위에 쌓입니다. 이미지가 업데이트되면 변경된 계층만 다시 빌드되므로 이미지를 구축하고 배포하는 프로세스가 효율적입니다.

graph TB
    subgraph Docker Image Layers
        layer1[Layer 1] --> layer2[Layer 2]
        layer2 --> layer3[Layer 3]
        layer3 --> layer4[Layer 4]
        layer4 --> layer5[Layer 5]
    end

Docker 이미지 크기

Docker 이미지의 크기는 애플리케이션과 사용된 기본 이미지에 따라 크게 달라질 수 있습니다. 몇 메가바이트에서 수십 기가바이트까지 다양합니다. 일반적으로 작은 이미지가 선호되는데, 이는 빌드, 다운로드 및 배포 속도가 빠르고 호스트 시스템의 스토리지 및 메모리 사용량이 적기 때문입니다.

기본 이미지 크기
alpine:latest 5.6 MB
ubuntu:latest 77.8 MB
nginx:latest 133 MB
python:3.9-slim 113 MB

Docker 이미지 레지스트리

Docker 이미지는 일반적으로 Docker 레지스트리에 저장됩니다. Docker 레지스트리는 Docker 이미지를 저장하고 배포하는 서비스입니다. 가장 인기 있는 레지스트리는 Docker Hub 로, 공개 Docker 이미지 저장소를 제공합니다. 개발자는 자신의 커스텀 이미지를 저장하고 관리하기 위해 개인 레지스트리를 설정할 수도 있습니다.

이미지 크기 최적화 기법

더 작은 기본 이미지 선택

Docker 이미지에 사용하는 기본 이미지는 최종 이미지 크기에 상당한 영향을 미칩니다. alpine 또는 scratch와 같은 더 작은 기본 이미지를 사용하면 전체 이미지 크기를 크게 줄일 수 있습니다.

## 더 큰 기본 이미지 사용
FROM ubuntu:latest
## 더 작은 기본 이미지 사용
FROM alpine:latest

계층 수 최소화

Dockerfile 의 각 명령은 이미지에 새로운 계층을 생성합니다. 계층 수를 최소화하면 전체 이미지 크기를 줄이는 데 도움이 됩니다.

## 좋지 않은 방법: 여러 RUN 명령
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## 좋은 방법: RUN 명령 결합
RUN apt-get update \
 && apt-get install -y curl wget

다단계 빌드 활용

다단계 빌드는 단일 Dockerfile 에서 여러 FROM 문을 사용할 수 있도록 합니다. 각 FROM 문은 다른 기본 이미지를 사용합니다. 이를 통해 필요한 구성 요소만 포함하여 더 작은 최종 이미지를 생성하는 데 도움이 됩니다.

## Dockerfile
FROM golang:1.16 AS builder
COPY . /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

이미지 캐싱 활용

Docker 의 이미지 캐싱 메커니즘은 빌드 프로세스를 최적화하고 이미지 빌드 시간을 줄이는 데 도움이 될 수 있습니다. 캐시된 계층을 재사용함으로써 Docker 는 변경되지 않은 이미지 부분을 다시 빌드하지 않을 수 있습니다.

사용하지 않는 Docker 리소스 정리

시간이 지남에 따라 Docker 환경에는 사용하지 않는 이미지, 컨테이너, 네트워크 및 볼륨이 누적되어 디스크 공간을 많이 차지할 수 있습니다. 정기적으로 이러한 사용하지 않는 리소스를 정리하면 Docker 환경을 깨끗하고 효율적으로 유지하는 데 도움이 됩니다.

## 사용하지 않는 Docker 리소스 정리
docker system prune -a

더 작은 Docker 이미지를 위한 최선의 방법

가벼운 기본 이미지 사용

앞서 언급했듯이 alpine 또는 scratch와 같은 더 작은 기본 이미지를 사용하면 Docker 이미지 크기를 크게 줄일 수 있습니다. 이러한 가벼운 기본 이미지는 필수 패키지와 종속성만 포함하여 전체 풋프린트를 최소화합니다.

## 가벼운 기본 이미지 사용
FROM alpine:latest

불필요한 패키지 설치 방지

Dockerfile 에서 패키지를 설치할 때는 애플리케이션 실행에 필요한 패키지만 설치하십시오. 필요하지 않은 추가 도구나 유틸리티를 설치하지 않으면 이미지 크기를 줄일 수 있습니다.

## 좋지 않은 방법: 불필요한 패키지 설치
RUN apt-get update \
 && apt-get install -y curl wget vim

## 좋은 방법: 필요한 패키지만 설치
RUN apt-get update \
 && apt-get install -y curl

다단계 빌드 활용

이전 섹션에서 설명했듯이 다단계 빌드는 빌드 및 런타임 환경을 분리하여 더 작은 최종 이미지를 생성하는 데 도움이 될 수 있습니다.

## 다단계 빌드를 사용하는 Dockerfile
FROM golang:1.16 AS builder
COPY . /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

.dockerignore 를 사용하여 불필요한 파일 제외

.dockerignore 파일을 사용하면 Docker 빌드 컨텍스트에서 제외할 파일 및 디렉터리를 지정할 수 있습니다. 이를 통해 빌드 컨텍스트 크기를 줄이고 결과적으로 최종 이미지 크기를 줄일 수 있습니다.

## .dockerignore
.git
*.md
Dockerfile

이미지 계층 최적화

여러 RUN 명령을 결합하고 && 연산자를 사용하며 불필요한 계층을 피하여 Dockerfile 을 최적화하십시오. 이를 통해 이미지의 계층 수를 줄이고 전체 크기를 줄일 수 있습니다.

## 좋지 않은 방법: 여러 RUN 명령
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## 좋은 방법: RUN 명령 결합
RUN apt-get update \
 && apt-get install -y curl wget

정기적인 사용하지 않는 리소스 정리

앞서 언급했듯이 정기적으로 사용하지 않는 Docker 리소스 (이미지, 컨테이너, 네트워크 및 볼륨) 를 정리하면 Docker 환경을 깨끗하고 효율적으로 유지하는 데 도움이 됩니다.

## 사용하지 않는 Docker 리소스 정리
docker system prune -a

이러한 최선의 방법을 따르면 Docker 이미지 크기를 효과적으로 최적화하여 빌드, 배포 및 배포를 더욱 효율적으로 만들 수 있습니다.

요약

이 포괄적인 튜토리얼에서는 Docker 이미지의 기본 원리를 이해하고 이미지 크기를 줄이기 위한 다양한 기법을 탐색하며 더 작고 효율적인 컨테이너를 구축하기 위한 최선의 방법을 따르는 방법을 배웁니다. 이 가이드에서 다루는 전략을 구현함으로써 Docker 기반 애플리케이션의 성능, 배포 및 전반적인 관리를 개선할 수 있습니다.