"scratch"는 Docker에서 제공하는 가장 최소한의 베이스 이미지입니다. 아무것도 없는 빈 상태의 이미지로, 특정한 환경을 포함하지 않습니다. 이는 도커 이미지에서 가능한 한 작고 가벼운 컨테이너를 만들고자 할 때 유용합니다.
1. scratch란?
정의:
- Docker에서 제공하는 공식 베이스 이미지 중 하나.
- 빈 상태의 이미지로, 운영체제나 유틸리티가 포함되어 있지 않음.
- "Docker의 시작점"이라고 불리며, 다른 이미지를 구축하는 기반으 로 사용됨.
크기:
- 0바이트. 즉, 어떤 파일이나 기능도 포함하지 않음.
2. scratch 이미지의 특징
최소한의 환경:
- 운영체제나 유틸리티가 포함되어 있지 않기 때문에, 매우 가볍고 빠릅니다.
- 필요한 바이너리와 라이브러리만 포함해야 합니다.
커스텀 이미지 생성:
- 완전히 빈 상태에서 시작하기 때문에, 특정 애플리케이션에 맞게 이미지를 구성할 수 있습니다.
보안 강화:
- 불필요한 패키지나 유틸리티가 없기 때문에 보안에 취약한 요소를 줄일 수 있습니다.
주로 컴파일된 애플리케이션에 사용:
- 고정된 바이너리(예: Go, C, Rust 등으로 빌드된 실행 파일)를 실행하는 데 적합합니다.
3. scratch 사용 방법
scratch 이미지는 도커에서 직접 다운로드하거나 pull 할 필요가 없습니다. 이미 도커에 내장되어 있습니다.
Dockerfile에서 scratch 사용
예를 들어, Go로 만든 간단한 애플리케이션을 scratch 이미지를 사용하여 실행할 수 있습니다:
# 1. Go 애플리케이션을 빌드 (static binary로)
FROM golang:1.20 AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
# 2. scratch를 기반으로 컨테이너 생성
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
- 빌드된 바이너리만 scratch 이미지에 복사하고 실행.
- 이 방식은 애플리케이션 크기를 최소화하고, 불필요한 파일들을 배제합니다.
4. scratch의 한계
운영체제가 없음:
- 일반적인 리눅스 유틸리티(
ls
,cat
,bash
,sh
)가 없기 때문에, 디버깅이 어렵습니다. - 디버깅이 필요할 경우, Ubuntu나 Alpine과 같은 경량 이미지를 사용하는 것이 좋습니다.
- 일반적인 리눅스 유틸리티(
직접적으로 사용할 수 없음:
- 기본적으로 모든 애플리케이션 파일과 라이브러리를 직접 포함해야 합니다.
- 예를 들어, Go나 C로 빌드된 정적 바이너리만 scratch에서 제대로 동작합니다.
5. scratch의 주요 사용 사례
경량 컨테이너 생성:
- 애플리케이션 실행에 꼭 필요한 바이너리와 파일만 포함하여 컨테이너 크기를 최소화.
배포 환경 최적화:
- CI/CD 파이프라인에서 배포 크기와 시간을 줄이는 데 사용.
고정된 바이너리 실행:
- Go, C, Rust로 컴파일된 정적 실행 파일을 포함한 컨테이너.
보안 강화:
- 불필요한 유틸리티가 없어서 보안 공격 표면이 줄어듭니다.
6. scratch vs Alpine
Feature | scratch | Alpine |
---|---|---|
크기 | 0바이트 | 약 5MB |
운영체제 포함 | 없음 | 경량 리눅스 |
유틸리티 | 없음 | 기본 유틸리티 포함 |
디버깅 가능 여부 | 불가능 | 가능 |
사용 용도 | 정적 바이너리 실행 | 경량 환경 및 디버깅 필요 시 |
7. 요약
- scratch는 도커에서 가장 기본이 되는 빈 상태의 베이스 이미지입니다.
- 모든 유틸리티나 운영체제가 없는 상태에서, 필요한 바이너리만 포함하여 최적화된 컨테이너를 생성하는 데 사용됩니다.
- Go, C, Rust와 같은 언어로 작성된 정적 실행 파일을 실행하거나, 애플리케이션 배포 크기를 최소화할 때 유용합니다.
- 디버깅이나 리눅스 도구가 필요한 경우 Alpine과 같은 경량 이미지를 사용하는 것이 더 적합합니다. 😊
'Docker' 카테고리의 다른 글
Docker 레이어 (0) | 2024.12.04 |
---|---|
Root 파일 시스템(root filesystem) (1) | 2024.12.04 |
Surface Area (1) | 2024.12.04 |
Makefile (0) | 2024.12.03 |
자주 사용하는 Docker 명령어 (0) | 2024.12.03 |