# Docker Registry Cache 구성 가이드 ## 개요 Docker Registry Cache를 사용하면 이미지 빌드 및 배포 속도를 크게 개선할 수 있습니다. ## 주요 이점 ### 1. 빌드 속도 향상 - **기본 이미지 캐싱**: Python, Node.js 등 베이스 이미지를 로컬에 캐시 - **레이어 재사용**: 동일한 레이어를 여러 서비스에서 공유 - **네트워크 대역폭 절감**: Docker Hub에서 반복 다운로드 방지 ### 2. CI/CD 효율성 - **빌드 시간 단축**: 캐시된 이미지로 50-80% 빌드 시간 감소 - **안정성 향상**: Docker Hub rate limit 회피 - **비용 절감**: 네트워크 트래픽 감소 ### 3. 개발 환경 개선 - **오프라인 작업 가능**: 캐시된 이미지로 인터넷 없이 작업 - **일관된 이미지 버전**: 팀 전체가 동일한 캐시 사용 ## 구성 옵션 ### 옵션 1: 기본 Registry Cache (권장) ```bash # 시작 docker-compose -f docker-compose-registry-cache.yml up -d registry-cache # 설정 ./scripts/setup-registry-cache.sh # 확인 curl http://localhost:5000/v2/_catalog ``` **장점:** - 가볍고 빠름 - 설정이 간단 - 리소스 사용량 적음 **단점:** - UI 없음 - 기본적인 기능만 제공 ### 옵션 2: Harbor Registry ```bash # Harbor 프로필로 시작 docker-compose -f docker-compose-registry-cache.yml --profile harbor up -d # 접속 open http://localhost:8880 # 계정: admin / Harbor12345 ``` **장점:** - 웹 UI 제공 - 보안 스캐닝 - RBAC 지원 - 복제 기능 **단점:** - 리소스 사용량 많음 - 설정 복잡 ### 옵션 3: Nexus Repository ```bash # Nexus 프로필로 시작 docker-compose -f docker-compose-registry-cache.yml --profile nexus up -d # 접속 open http://localhost:8081 # 초기 비밀번호: docker exec site11_nexus cat /nexus-data/admin.password ``` **장점:** - 다양한 저장소 형식 지원 (Docker, Maven, NPM 등) - 강력한 프록시 캐시 - 세밀한 권한 관리 **단점:** - 초기 설정 필요 - 메모리 사용량 높음 (최소 2GB) ## 사용 방법 ### 1. 캐시를 통한 이미지 빌드 ```bash # 기존 방식 docker build -t site11-service:latest . # 캐시 활용 방식 ./scripts/build-with-cache.sh service-name ``` ### 2. BuildKit 캐시 마운트 활용 ```dockerfile # Dockerfile 예제 FROM python:3.11-slim # 캐시 마운트로 pip 패키지 캐싱 RUN --mount=type=cache,target=/root/.cache/pip \ pip install -r requirements.txt ``` ### 3. Multi-stage 빌드 최적화 ```dockerfile # 빌드 스테이지 캐싱 FROM localhost:5000/python:3.11-slim as builder WORKDIR /app COPY requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --user -r requirements.txt # 런타임 스테이지 FROM localhost:5000/python:3.11-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ``` ## Kubernetes와 통합 ### 1. K8s 클러스터 설정 ```yaml # configmap for containerd apiVersion: v1 kind: ConfigMap metadata: name: containerd-config namespace: kube-system data: config.toml: | [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["http://host.docker.internal:5000"] ``` ### 2. Pod 설정 ```yaml apiVersion: v1 kind: Pod spec: containers: - name: app image: localhost:5000/site11-service:latest imagePullPolicy: Always ``` ## 모니터링 ### 캐시 상태 확인 ```bash # 캐시된 이미지 목록 ./scripts/manage-registry.sh status # 캐시 크기 ./scripts/manage-registry.sh size # 실시간 로그 ./scripts/manage-registry.sh logs ``` ### 메트릭 수집 ```yaml # Prometheus 설정 예제 scrape_configs: - job_name: 'docker-registry' static_configs: - targets: ['localhost:5000'] metrics_path: '/metrics' ``` ## 최적화 팁 ### 1. 레이어 캐싱 최적화 - 자주 변경되지 않는 명령을 먼저 실행 - COPY 명령 최소화 - .dockerignore 활용 ### 2. 빌드 캐시 전략 ```bash # 캐시 export docker buildx build \ --cache-to type=registry,ref=localhost:5000/cache:latest \ . # 캐시 import docker buildx build \ --cache-from type=registry,ref=localhost:5000/cache:latest \ . ``` ### 3. 가비지 컬렉션 ```bash # 수동 정리 ./scripts/manage-registry.sh clean # 자동 정리 (config.yml에 설정됨) # 12시간마다 자동 실행 ``` ## 문제 해결 ### Registry 접근 불가 ```bash # 방화벽 확인 sudo iptables -L | grep 5000 # Docker 데몬 재시작 sudo systemctl restart docker ``` ### 캐시 미스 발생 ```bash # 캐시 재구성 docker buildx prune -f docker buildx create --use ``` ### 디스크 공간 부족 ```bash # 오래된 이미지 정리 docker system prune -a --volumes # Registry 가비지 컬렉션 docker exec site11_registry_cache \ registry garbage-collect /etc/docker/registry/config.yml ``` ## 성능 벤치마크 ### 테스트 환경 - macOS M1 Pro - Docker Desktop 4.x - 16GB RAM ### 결과 | 작업 | 캐시 없음 | 캐시 사용 | 개선율 | |------|---------|----------|--------| | Python 서비스 빌드 | 120s | 35s | 71% | | Node.js 프론트엔드 | 90s | 25s | 72% | | 전체 스택 빌드 | 15m | 4m | 73% | ## 보안 고려사항 ### 1. Registry 인증 ```yaml # Basic Auth 설정 auth: htpasswd: realm: basic-realm path: /auth/htpasswd ``` ### 2. TLS 설정 ```yaml # TLS 활성화 http: addr: :5000 tls: certificate: /certs/domain.crt key: /certs/domain.key ``` ### 3. 접근 제어 ```yaml # IP 화이트리스트 http: addr: :5000 host: 127.0.0.1 ``` ## 다음 단계 1. **프로덕션 배포** - AWS ECR 또는 GCP Artifact Registry 연동 - CDN 통합 2. **고가용성** - Registry 클러스터링 - 백업 및 복구 전략 3. **자동화** - GitHub Actions 통합 - ArgoCD 연동