Harbor - Docker 비공개 레지스트리 구축 가이드

사전 요구사항

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를 활성화하고 적절한 인증서를 적용해야 한다.

태그: Harbor docker private-registry container DevOps

6월 16일 01:14에 게시됨