보안 기능:
- Trivy 통합 취약점 스캐닝 (기본 내장)
- Clair 스캐너 지원
- 정책 기반 이미지 배포 차단
- CVE 데이터베이스 자동 업데이트
- 취약점 심각도별 분류 및 알림
- 스캔 결과 웹 UI에서 시각화
- 자동 스캔 스케줄링
- 화이트리스트 기반 취약점 예외 처리
보안 기능:
- 기본 취약점 스캐닝 없음
- 서드파티 도구 연동 필요 (추가 비용)
- 제한적인 정책 엔진
- 수동적인 보안 검사 프로세스
UI/UX 장점:
- 현대적이고 직관적인 웹 UI
- 컨테이너 레지스트리 전용 최적화
- 이미지 레이어 시각화
- Dockerfile 분석 결과 표시
- 실시간 스캔 진행 상황 표시
- 모바일 친화적 반응형 디자인
- 다크모드 지원
- 빠른 검색 및 필터링
UI/UX 특징:
- 범용 아티팩트 관리 중심 UI
- 컨테이너 기능은 부가적
- 복잡한 설정 메뉴 구조
- 상대적으로 느린 반응 속도
K8s 통합:
- Helm Chart 공식 지원
- Kubernetes RBAC 네이티브 연동
- Service Mesh 지원 (Istio)
- OCI 아티팩트 지원 (Helm Chart, CNAB)
- Kubernetes Admission Controller
- Harbor Operator 제공
- Multi-cluster 복제 지원
K8s 통합:
- 기본적인 Docker Registry 기능
- 제한적인 Kubernetes 통합
- 복잡한 설정 필요
- 별도 도구 의존성 높음
복제 기능:
- 멀티 마스터 복제 지원
- Cross-region 복제
- 선택적 복제 (프로젝트/태그별)
- 복제 상태 실시간 모니터링
- 자동 failover 지원
- 대역폭 제한 설정
- 암호화된 복제 채널
복제 기능:
- 제한적인 복제 기능
- 복잡한 설정 과정
- 수동 모니터링 필요
- Pro 버전에서만 고급 기능 제공
비용 구조:
- 완전 무료 오픈소스
- 엔터프라이즈 기능 기본 포함
- 커뮤니티 지원 활발
- CNCF 프로젝트로 지속성 보장
- 벤더 락인 없음
비용 구조:
- OSS 버전 기능 제한
- Pro 버전 라이선스 비용
- 고급 기능 유료화
- 상업적 지원 의존도 높음
| 기능 | Harbor | Nexus OSS | Nexus Pro |
|---|---|---|---|
| 내장 스캐너 | ✅ Trivy/Clair | ❌ 없음 | 🔶 제한적 |
| 자동 스캔 | ✅ 스케줄링 | ❌ 없음 | ✅ 있음 |
| 정책 기반 차단 | ✅ 강력함 | ❌ 없음 | ✅ 있음 |
| CVE 상세 정보 | ✅ 풍부함 | ❌ 없음 | 🔶 기본적 |
| 수정 가이드 | ✅ 제공 | ❌ 없음 | 🔶 제한적 |
graph TB
A[Harbor Portal] --> B[Harbor Core]
B --> C[Registry]
B --> D[Trivy Scanner]
B --> E[Chart Museum]
B --> F[Job Service]
F --> G[Replication]
F --> H[Garbage Collection]
I[PostgreSQL] --> B
J[Redis] --> B
# harbor-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: harbor-core
spec:
replicas: 2
selector:
matchLabels:
app: harbor-core
template:
metadata:
labels:
app: harbor-core
spec:
containers:
- name: core
image: goharbor/harbor-core:v2.9.0
env:
- name: CORE_SECRET
valueFrom:
secretKeyRef:
name: harbor-secret
key: secret
ports:
- containerPort: 8080
volumeMounts:
- name: config
mountPath: /etc/core/app.conf
livenessProbe:
httpGet:
path: /api/v2.0/ping
port: 8080
initialDelaySeconds: 300
readinessProbe:
httpGet:
path: /api/v2.0/ping
port: 8080
initialDelaySeconds: 20
---
apiVersion: v1
kind: Service
metadata:
name: harbor-core
spec:
selector:
app: harbor-core
ports:
- port: 80
targetPort: 8080
# harbor-security-policy.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: harbor-security-policy
data:
policy.yaml: |
policies:
- name: "vulnerability-policy"
description: "Block images with high severity vulnerabilities"
rules:
- rule_type: "vulnerability"
parameters:
severity: "high"
action: "block"
- name: "content-trust"
description: "Require signed images"
rules:
- rule_type: "signature"
parameters:
required: true
action: "block"
- name: "scan-policy"
description: "Auto scan on push"
rules:
- rule_type: "scan_on_push"
parameters:
enabled: true
| 메트릭 | Harbor | Nexus |
|---|---|---|
| 이미지 푸시 속도 | 🟢 빠름 | 🟡 보통 |
| 이미지 풀 속도 | 🟢 빠름 | 🟡 보통 |
| 웹 UI 응답속도 | 🟢 빠름 | 🔴 느림 |
| 메모리 사용량 | 🟢 최적화 | 🟡 높음 |
| 스토리지 효율성 | 🟢 우수 | 🟡 보통 |
주요 통합:
CI/CD:
- Jenkins Harbor Plugin
- GitLab CI/CD 네이티브 지원
- GitHub Actions
- Tekton Pipelines
보안 도구:
- Trivy (기본 내장)
- Clair
- Anchore (연동 가능)
- Falco 런타임 보안
모니터링:
- Prometheus 메트릭 내장
- Grafana 대시보드
- ELK Stack 로그 연동
클라우드:
- AWS ECR 복제
- Azure ACR 복제
- GCR 복제
- 멀티 클라우드 지원
# GitLab CI/CD with Harbor
stages:
- build
- security-scan
- deploy
variables:
HARBOR_REGISTRY: "harbor.company.com"
PROJECT_NAME: "production"
build:
stage: build
script:
- docker build -t $HARBOR_REGISTRY/$PROJECT_NAME/$CI_PROJECT_NAME:$CI_COMMIT_SHA .
- docker push $HARBOR_REGISTRY/$PROJECT_NAME/$CI_PROJECT_NAME:$CI_COMMIT_SHA
security-scan:
stage: security-scan
script:
- |
# Harbor API로 스캔 트리거
curl -X POST \
-H "Authorization: Basic $(echo -n admin:password | base64)" \
"$HARBOR_REGISTRY/api/v2.0/projects/$PROJECT_NAME/repositories/$CI_PROJECT_NAME/artifacts/$CI_COMMIT_SHA/scan"
- |
# 스캔 결과 확인
SCAN_STATUS=""
while [ "$SCAN_STATUS" != "Success" ]; do
sleep 10
SCAN_STATUS=$(curl -s \
-H "Authorization: Basic $(echo -n admin:password | base64)" \
"$HARBOR_REGISTRY/api/v2.0/projects/$PROJECT_NAME/repositories/$CI_PROJECT_NAME/artifacts/$CI_COMMIT_SHA" \
| jq -r '.scan_overview."application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0".scan_status')
echo "Scan status: $SCAN_STATUS"
done
- |
# 취약점 확인
HIGH_VULNS=$(curl -s \
-H "Authorization: Basic $(echo -n admin:password | base64)" \
"$HARBOR_REGISTRY/api/v2.0/projects/$PROJECT_NAME/repositories/$CI_PROJECT_NAME/artifacts/$CI_COMMIT_SHA" \
| jq '.scan_overview."application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0".summary.total.high')
if [ "$HIGH_VULNS" -gt 0 ]; then
echo "High severity vulnerabilities found: $HIGH_VULNS"
exit 1
fi
deploy:
stage: deploy
script:
- kubectl set image deployment/app container=$HARBOR_REGISTRY/$PROJECT_NAME/$CI_PROJECT_NAME:$CI_COMMIT_SHA
only:
- main
# harbor-replication-rule.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: harbor-replication-config
data:
replication.json: |
{
"name": "prod-to-dr-replication",
"description": "Replicate production images to DR site",
"src_registry": {
"type": "harbor",
"url": "https://harbor-prod.company.com",
"credential": {
"access_key": "admin",
"access_secret": "password"
}
},
"dest_registry": {
"type": "harbor",
"url": "https://harbor-dr.company.com",
"credential": {
"access_key": "admin",
"access_secret": "password"
}
},
"filters": [
{
"type": "name",
"value": "production/**"
},
{
"type": "tag",
"value": "v*"
}
],
"trigger": {
"type": "event_based"
},
"replicate_deletion": true,
"override": false,
"enabled": true
}
#!/bin/bash
# nexus-to-harbor-migration.sh
NEXUS_URL="nexus.company.com:8082"
HARBOR_URL="harbor.company.com"
NEXUS_REPO="docker-repo"
HARBOR_PROJECT="migrated"
echo "🚀 Nexus to Harbor 마이그레이션 시작..."
# 1. Nexus에서 이미지 목록 가져오기
echo "📋 Nexus 이미지 목록 수집 중..."
IMAGES=$(curl -s -u admin:password \
"http://$NEXUS_URL/service/rest/v1/search?repository=$NEXUS_REPO&format=docker" \
| jq -r '.items[].name')
# 2. 각 이미지를 Harbor로 마이그레이션
for IMAGE in $IMAGES; do
echo "🔄 마이그레이션 중: $IMAGE"
# Nexus에서 풀
docker pull $NEXUS_URL/$IMAGE
# Harbor로 태그 변경
docker tag $NEXUS_URL/$IMAGE $HARBOR_URL/$HARBOR_PROJECT/$IMAGE
# Harbor로 푸시
docker push $HARBOR_URL/$HARBOR_PROJECT/$IMAGE
# 로컬 이미지 정리
docker rmi $NEXUS_URL/$IMAGE
docker rmi $HARBOR_URL/$HARBOR_PROJECT/$IMAGE
echo "✅ 완료: $IMAGE"
done
echo "🎉 마이그레이션 완료!"
Harbor는 컨테이너 레지스트리 전용으로 설계되어 다음 영역에서 Nexus보다 월등한 장점을 제공합니다:
컨테이너 중심 환경이라면 Harbor가 명확한 선택입니다!