도커 이미지 최적화: 크기 축소 및 보안 강화
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 개발자 및 DevOps 엔지니어: 도커 이미지의 크기와 보안을 개선하고자 하는 사람들
- 난이도: 중간 (기초 Docker 지식이 필요)
핵심 요약
- 최소 기반 이미지 사용:
Alpine
또는Distroless
와 같은 최소 기반 이미지를 사용하여 이미지 크기와 공격 표면을 줄임 - 다단계 빌드 적용:
multi-stage builds
로 빌드 의존성을 분리하여 최종 이미지 크기 50-80% 감소 - 보안 강화: 비루트 사용자 실행,
--no-cache
옵션,HEALTHCHECK
적용, 자동 보안 스캔 도구(예: Trivy) 통합
섹션별 세부 요약
1. 성능 및 보안 영향
- 성능 향상: 작은 이미지는 배포 시간, 네트워크 전송 시간, 저장 비용, 컨테이너 시작 시간을 줄임
- 보안 향상: 공격 표면 감소, 취약점 감소, 감사 용이, 유지보수 비용 감소
2. 기반 이미지 선택
- Alpine Linux: 최소 패키지, 보안 중심 설계, 정기 업데이트,
apk
패키지 관리자 최적화 - Distroless: 쉘 및 패키지 관리자 없음, 런타임 의존성만 포함, 다중 언어 지원
3. 다단계 빌드
- 예시 코드:
```Dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
RUN npm run build
FROM node:18-alpine AS production
COPY --from=builder /app/dist ./dist
```
- 효과: 빌드 의존성과 런타임 요구 사항 분리로 이미지 크기 감소
4. 레이어 최적화
- 레이어 순서 조정:
npm install
및npm run build
명령을 분리하여 캐싱 효율성 향상 - 필요 없는 패키지 제거:
apt-get clean
및/var/lib/apt/lists/*
파일 제거
5. 보안 최선 실천
- 비루트 사용자 실행:
USER appuser
명령으로 비루트 사용자 생성 - 보안 테스트 도구 통합:
```yaml
name: Docker Security Scan
on: [push, pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
```
6. `.dockerignore` 파일 생성
- 제외 파일:
.git
,node_modules
,dist
,test/
,README.md
등 불필요한 파일 제외
7. 런타임 보안 구성
- Docker Compose 예시:
```yaml
services:
app:
read_only: true
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
```
8. Python Flask 예제
- 최적화된 Dockerfile:
```Dockerfile
FROM python:3.11-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends gcc
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
FROM python:3.11-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates
COPY --from=builder /root/.local /home/appuser/.local
```
9. 최적화 지표 추적
- 명령어:
```bash
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
trivy image myapp:latest
time docker run --rm myapp:latest
```
결론
- ✅ 최소 기반 이미지 사용:
Alpine:3.18
또는gcr.io/distroless/java:11
선택 - ✅ 다단계 빌드 적용:
FROM ... AS builder
구조 활용 - ✅ 보안 강화: 비루트 사용자,
--no-cache
옵션,HEALTHCHECK
명령 포함 - ✅ 자동 보안 스캔: Trivy, Snyk, Clair 도구 통합
- ✅ 이미지 업데이트 유지:
apt-get upgrade
및apk update
정기 수행 - ✅ .dockerignore 파일: 불필요한 파일 제외로 빌드 시간 단축
- ✅ 레이어 최적화:
RUN
명령 병합 및apt-get clean
적용 - ✅ 최소 권한 원칙:
cap_drop
및no-new-privileges
설정 활용 - ✅ 보안 테스트 자동화: CI/CD 파이프라인에 Trivy 도구 통합
- ✅ 이미지 크기 감시:
docker images
및docker history
명령으로 지속적 모니터링