AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

도커 이미지 최적화: 크기 축소 및 보안 강화

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • 개발자 및 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 installnpm 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 upgradeapk update 정기 수행
  • .dockerignore 파일: 불필요한 파일 제외로 빌드 시간 단축
  • 레이어 최적화: RUN 명령 병합 및 apt-get clean 적용
  • 최소 권한 원칙: cap_dropno-new-privileges 설정 활용
  • 보안 테스트 자동화: CI/CD 파이프라인에 Trivy 도구 통합
  • 이미지 크기 감시: docker imagesdocker history 명령으로 지속적 모니터링