사전 요구사항
Docker 버전 17.06.0 이상, docker-compose 버전 1.18.0 이상이 필요하다.
Harbor 설치 과정
설치 파일은 공식 GitHub 저장소(https://github.com/goharbor/harbor/releases)에서 다운로드할 수 있다.
1. 압축 해제
# tar -xvf harbor-offline-installer-v1.9.4.tgz -C /usr/local/
2. 환경 설정 파일 수정
harbor.yml 파일을 열어 필요한 설정을 구성한다.
# Harbor 설정 파일
# 관리자 UI 및 레지스트리 서비스에 접근할 호스트명 또는 IP 주소
# localhost 또는 127.0.0.1은 사용할 수 없으며, 외부 클라이언트 접근이 필요합니다
hostname: registry.internal.local
# HTTP 관련 설정
# http:
# 기본 포트는 80, HTTPS 활성화 시 해당 포트로 리다이렉트됩니다
# port: 80
# HTTPS 관련 설정
https:
# Harbor 전용 HTTPS 포트, 기본값은 443
port: 443
# NGINX 인증서 및 키 파일 경로
certificate: /data/cert/server.crt
private_key: /data/cert/server.key
# 외부 프록시 사용 시 external_url 설정 (활성화 시 hostname은 사용되지 않음)
# external_url: https://reg.mydomain.com:8433
# Harbor 관리자 초기 비밀번호
# 설치 시 한 번만 적용되므로, 설치 후 UI에서 반드시 변경하세요
harbor_admin_password: Admin@12345
# Harbor 데이터베이스 설정
database:
# Harbor DB 루트 사용자 비밀번호
# 운영 환경에서는 반드시 변경하세요
password: DbPass1234
# 유휴 연결 풀의 최대 연결 수 (0 이하 시 유휴 연결 없음)
max_idle_conns: 50
# 데이터베이스 최대 동시 연결 수 (0 이하 시 무제한)
# PostgreSQL 기본값은 100
max_open_conns: 100
# 기본 데이터 볼륨 경로
data_volume: /data
# 로컬 파일시스템을 기본 스토리지로 사용 (/data 디렉토리)
# 외부 스토리지 사용 시 storage_service 설정 제거
# storage_service:
# # 자체 서명 인증서를 사용하는 내부 스토리지용 커스텀 CA 인증서 경로
# ca_bundle:
# # 스토리지 백엔드: filesystem, azure, gcs, s3, swift, oss 선택 가능
# filesystem:
# maxthreads: 100
# # 레지스트리 리다이렉트 비활성화
# redirect:
# disabled: false
# 취약점 스캐너 Clair 설정
clair:
# Clair 업데이트 간격 (시간 단위), 0으로 설정 시 비활성화
updaters_interval: 12
jobservice:
# 작업 서비스 최대 워커 스레드 수
max_job_job_workers: 10
notification:
# 웹훅 작업 최대 재시도 횟수
webhook_job_max_retry: 10
chart:
# Chart URL을 절대 경로로 설정 (enabled로 변경 시 활성화)
absolute_url: disabled
# 로그 설정
log:
# 로그 레벨: debug, info, warning, error, fatal
level: info
# 로컬 스토리지 로그 설정
local:
# 로테이션 횟수 (0 시 로테이션 없이 삭제)
rotate_count: 50
# 로테이션 기준 파일 크기 (K, M, G 단위 지원)
rotate_size: 200M
# 로그 저장 디렉토리
location: /var/log/harbor
# 외부 syslog 설정 (주석 해제 시 활성화)
# external_endpoint:
# # 프로토콜: tcp 또는 udp
# protocol: tcp
# 외부 엔드포인트 호스트
# host: localhost
# 외부 엔드포인트 포트
# port: 5140
# 설정 파일 버전 감지용 (수정 금지)
_version: 1.9.0
# 외부 데이터베이스 사용 시 주석 해제
# external_database:
# harbor:
# host: harbor_db_host
# port: harbor_db_port
# db_name: harbor_db_name
# username: harbor_db_username
# password: harbor_db_password
# ssl_mode: disable
# max_idle_conns: 2
# max_open_conns: 0
# clair:
# host: clair_db_host
# port: clair_db_port
# db_name: clair_db_name
# username: clair_db_username
# password: clair_db_password
# ssl_mode: disable
# notary_signer:
# host: notary_signer_db_host
# port: notary_signer_db_port
# db_name: notary_signer_db_name
# username: notary_signer_db_username
# password: notary_signer_db_password
# ssl_mode: disable
# notary_server:
# host: notary_server_db_host
# port: notary_server_db_port
# db_name: notary_server_db_name
# username: notary_server_db_username
# password: notary_server_db_password
# ssl_mode: disable
# 외부 Redis 사용 시 주석 해제
# external_redis:
# host: redis
# port: 6379
# password:
# db_index 0은 core용으로 고정
# registry_db_index: 1
# jobservice_db_index: 2
# chartmuseum_db_index: 3
# 자체 서명 인증서를 사용하는 UAA 인스턴스 신뢰 설정
# uaa:
# ca_file: /path/to/ca
# 전역 프록시 설정
# 컴포넌트 간 통신에는 프록시가 필요하지 않습니다
# 특정 컴포넌트의 프록시를 비활성화하려면 components 배열에서 제거
# 복제 기능 사용 시 core와 jobservice에 프록시 필수
# http_proxy 및 https_proxy 설정 필요
# 특정 레지스트리만 프록시 제외 시 no_proxy에 도메인 추가
proxy:
http_proxy:
https_proxy:
# no_proxy 목록에는 기본값으로 다음이 포함됨:
# 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair,chartmuseum,notary-server
no_proxy:
components:
- core
- jobservice
- clair
3. HTTPS 인증서 생성
# 개인키 생성
# openssl genrsa -des3 -out server.key 2048
# CSR(인증서 서명 요청) 생성
# openssl req -new -key server.key -out server.csr
# 원본 키 파일 백업
# cp server.key server.key.org
# 비밀번호 제거된 키 생성
# openssl rsa -in server.key.org -out server.key
# 자체 서명 인증서 생성 (365일 유효)
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# 인증서 저장 디렉토리 생성
# mkdir -p /data/cert
# 인증서 파일 이동
# mv server.* /data/cert/
4. 설치 스크립트 실행
# ./install.sh
5. 설치 검증
웹 브라우저에서
http://registry.internal.local에 접근한다.
기본 관리자 계정 정보:
- 사용자명:
admin
- 비밀번호:
Admin@12345
설치 완료 후 즉시 비밀번호를 변경하는 것을 권장한다.
6. 이미지 업로드 테스트
6.1 Docker 데몬 레지스트리 설정
/etc/docker/daemon.json 파일에 비보안 레지스트리를 추가한다.
# vim /etc/docker/daemon.json
{
"insecure-registries": ["registry.internal.local"]
}
Docker 데몬을 재시작한다.
# systemctl restart docker
6.2 테스트용 기본 이미지 다운로드
# docker pull alpine:latest
6.3 이미지 태그 재지정
# docker tag alpine:latest registry.internal.local/test/alpine:1.0
6.4 레지스트리 로그인 및 이미지 푸시
# docker login registry.internal.local
# docker push registry.internal.local/test/alpine:1.0
7. 다른 호스트에서 이미지 다운로드 테스트
7.1 동일 레지스트리 설정 적용
다운로드할 호스트에서도 동일한 insecure-registries 설정을 적용한다.
# vim /etc/docker/daemon.json
{
"insecure-registries": ["registry.internal.local"]
}
Docker 데몬을 재시작한 후 이미지를Pull한다.
# docker pull registry.internal.local/test/alpine:1.0
참고사항
Harbor는 Docker 이미지를企业内部에서 관리할 수 있는 종합적인 레지스트리 솔루션이다. 웹 UI, 역할 기반 접근 제어, 취약점 스캐닝, 이미지 서명 등의 고급 기능을 제공한다. 프로덕션 환경에서는 반드시 HTTPS를 활성화하고 적절한 인증서를 적용해야 한다.