나만의 클라우드 컨테이너 레지스트리 구축하기: Docker Hub 클론 만들기 A to Z 가이드 🚀

콘텐츠 대표 이미지 - 나만의 클라우드 컨테이너 레지스트리 구축하기: Docker Hub 클론 만들기 A to Z 가이드 🚀

 

 

안녕하세요 개발자 여러분! 🙌 오늘은 2025년 3월 기준 최신 기술로 나만의 Docker Hub 같은 컨테이너 레지스트리를 구축하는 방법을 알아볼게요. 컨테이너화가 대세인 요즘, 개인 프로젝트나 회사에서 프라이빗 이미지 저장소가 필요하신 분들 많으시죠? 이 글을 따라오시면 여러분도 곧 나만의 컨테이너 레지스트리 주인이 될 수 있어요! 😎

📑 목차

  1. 컨테이너 레지스트리란 무엇인가요?
  2. 왜 직접 레지스트리를 구축해야 할까요?
  3. 필요한 기술 스택 살펴보기
  4. 클라우드 환경 구성하기
  5. Harbor 기반 레지스트리 구축하기
  6. Docker Registry 직접 구축하기
  7. 보안 설정 및 접근 제어
  8. CI/CD 파이프라인 연동하기
  9. 모니터링 및 유지보수
  10. 마무리 및 추가 리소스

1. 컨테이너 레지스트리란 무엇인가요? 🤔

컨테이너 레지스트리는 쉽게 말해서 도커 이미지들의 저장소예요. 깃허브가 코드를 저장하는 곳이라면, 컨테이너 레지스트리는 도커 이미지를 저장하고 관리하는 곳이죠. 가장 유명한 건 Docker Hub지만, 요즘엔 GitHub Container Registry, AWS ECR, Google Container Registry 등 다양한 서비스가 있어요.

알고 계셨나요? 📢 2025년 기준으로 전 세계 기업의 약 87%가 컨테이너 기술을 활용하고 있으며, 이 중 65%는 프라이빗 레지스트리를 운영 중이라고 해요!

컨테이너 레지스트리 웹앱 v1.2 API v2.0 DB v1.0 백엔드 v3.1 프론트 v2.5 캐시 v1.1 Docker 클라이언트 push / pull

레지스트리는 단순히 이미지만 저장하는 게 아니라 버전 관리, 접근 제어, 취약점 스캔 같은 기능도 제공해요. 특히 기업 환경에서는 보안과 컴플라이언스 때문에 자체 레지스트리가 필수인 경우가 많죠! 🔒

2. 왜 직접 레지스트리를 구축해야 할까요? 🧐

Docker Hub 쓰면 되는데 왜 직접 만들어야 하냐고요? 진짜 좋은 질문이에요! ㅋㅋㅋ 여기 몇 가지 이유가 있어요:

  1. 비용 절감 - Docker Hub 프라이빗 저장소는 월 구독료가 있지만, 자체 레지스트리는 초기 구축 후 유지비만 들어요. 특히 이미지가 많고 크다면 장기적으로 더 경제적이죠!
  2. 데이터 주권 - 민감한 코드가 담긴 이미지를 외부 서비스에 저장하기 꺼려지는 경우가 있죠. 자체 레지스트리는 데이터가 내부망에 있어 보안이 강화돼요.
  3. 네트워크 성능 - 내부 네트워크에서 이미지를 주고받으면 외부 레지스트리보다 훨씬 빠르게 이미지를 배포할 수 있어요. CI/CD 파이프라인이 빨라지죠! 🚀
  4. 커스터마이징 - 회사나 팀에 필요한 기능을 직접 추가하거나 기존 시스템과 통합할 수 있어요.
  5. 인터넷 연결 없이 작동 - 폐쇄망 환경에서도 컨테이너 배포가 가능해져요.

"우리 회사는 자체 컨테이너 레지스트리를 구축한 후 배포 시간이 68% 단축됐어요. 개발자들이 '드디어 커피 한 잔 마실 시간도 없이 배포가 끝난다'고 투덜대더라고요! ㅋㅋ" - 어느 DevOps 엔지니어

재능넷에서도 개발자들을 위한 다양한 DevOps 관련 재능거래가 활발하게 이루어지고 있어요. 컨테이너 레지스트리 구축 경험이 있다면 좋은 부가수입이 될 수도 있죠! 😉

3. 필요한 기술 스택 살펴보기 💻

자체 레지스트리를 구축하려면 어떤 기술들이 필요할까요? 2025년 현재 가장 인기 있는 옵션들을 살펴볼게요!

1. Docker Registry (기본형) 🐳

Docker에서 공식 제공하는 오픈소스 레지스트리예요. 가장 기본적인 기능만 제공하지만, 간단하게 시작하기 좋아요.

장점: 설치가 쉽고, 리소스 요구사항이 적음

단점: UI가 없고, 고급 기능(취약점 스캔, RBAC 등)이 제한적

2. Harbor (엔터프라이즈급) 🚢

CNCF 졸업 프로젝트인 Harbor는 2025년 현재 가장 인기 있는 엔터프라이즈급 레지스트리예요. 웹 UI, RBAC, 이미지 스캔 등 풍부한 기능을 제공해요.

장점: 완전한 기능 세트, 활발한 커뮤니티, 엔터프라이즈 지원

단점: 설치와 구성이 복잡하고, 리소스 요구사항이 높음

3. Nexus Repository (통합형) 📦

Docker 이미지뿐만 아니라 npm, Maven 등 다양한 패키지도 함께 관리할 수 있는 통합 저장소예요.

장점: 다양한 패키지 타입 지원, 단일 관리 포인트

단점: Docker 전용 기능은 Harbor보다 제한적

4. GitLab Container Registry (통합형) 🦊

GitLab을 이미 사용 중이라면, 내장된 컨테이너 레지스트리를 활용할 수 있어요.

장점: GitLab과 완벽한 통합, CI/CD 파이프라인 연동 용이

단점: GitLab 없이는 사용 불가, 독립적인 확장이 어려움

이 글에서는 가장 많이 사용되는 Docker Registry와 Harbor를 중심으로 설명할게요. 두 가지 방식으로 구축하는 방법을 모두 알려드릴게요! 👍

🔥 2025년 트렌드 팁: 최근에는 GitOps 방식으로 레지스트리를 관리하는 추세예요. 인프라 코드를 Git으로 관리하면 변경 이력 추적과 롤백이 쉬워져요!

4. 클라우드 환경 구성하기 ☁️

레지스트리를 어디에 호스팅할지 결정해야 해요. 2025년 기준으로 가장 인기 있는 클라우드 옵션들을 살펴볼게요!

클라우드 환경 비교 AWS EKS + ECR 장점: - 높은 안정성 - 글로벌 인프라 - AWS 서비스 통합 단점: - 비용 관리 복잡 - 벤더 종속성 GCP GKE + Artifact Registry 장점: - Kubernetes 친화적 - 빠른 네트워크 - 머신러닝 통합 단점: - 일부 지역 제한 - 학습 곡선 Azure AKS + ACR 장점: - 기업 친화적 - MS 제품 통합 - 하이브리드 클라우드 단점: - 복잡한 가격 체계 - 일부 서비스 성숙도 On-Premise K8s + 자체 레지스트리 장점: - 완전한 제어 - 데이터 주권 - 장기적 비용 절감 단점: - 초기 투자 비용 - 유지보수 부담 2025년 기준 클라우드 환경별 컨테이너 레지스트리 구축 옵션

이 글에서는 AWS를 기준으로 설명할게요. AWS는 ECR(Elastic Container Registry)이라는 관리형 레지스트리 서비스를 제공하지만, 우리는 직접 구축하는 방법을 알아볼 거예요!

AWS 환경 준비하기

먼저 EC2 인스턴스를 준비해볼게요. 레지스트리 용도로는 다음 사양이 적당해요:

  • ✅ t3.medium 이상 (2 vCPU, 4GB RAM)
  • ✅ 최소 100GB 스토리지 (이미지 크기에 따라 조정)
  • ✅ Ubuntu 22.04 LTS 또는 Amazon Linux 2023
  • ✅ 보안그룹: 80/443(HTTP/HTTPS), 22(SSH), 5000(Registry) 포트 오픈

EC2 인스턴스에 접속한 후, 기본 패키지를 업데이트하고 Docker를 설치해요:


# Ubuntu 기준
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-compose
sudo usermod -aG docker $USER
      

Docker Compose도 필요해요. 2025년 기준 최신 버전을 설치해볼게요:


# Docker Compose 설치 (v2.x)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
    

여기서 잠깐! 💡 프로덕션 환경에서는 반드시 도메인과 SSL 인증서를 준비하세요. Let's Encrypt로 무료 인증서를 발급받을 수 있어요.

5. Harbor 기반 레지스트리 구축하기 🚢

Harbor는 CNCF의 졸업 프로젝트로, 엔터프라이즈급 컨테이너 레지스트리예요. 웹 UI, RBAC(역할 기반 접근 제어), 취약점 스캔, 복제 등 다양한 기능을 제공해요. 2025년 현재 가장 인기 있는 오픈소스 레지스트리 솔루션이죠!

Harbor 설치 준비

먼저 Harbor 설치 파일을 다운로드해요. 2025년 3월 기준 최신 버전은 v2.10.x예요:


# Harbor 다운로드
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
tar xzvf harbor-online-installer-v2.10.0.tgz
cd harbor
    

설치 전에 harbor.yml.tmpl 파일을 harbor.yml로 복사하고 설정을 수정해야 해요:


cp harbor.yml.tmpl harbor.yml
nano harbor.yml
    

주요 설정 항목은 다음과 같아요:


# harbor.yml 주요 설정
hostname: registry.yourdomain.com  # 여러분의 도메인으로 변경하세요

# http 관련 설정
http:
  port: 80

# https 관련 설정 (프로덕션에서는 반드시 활성화하세요)
https:
  port: 443
  certificate: /your/certificate/path.crt
  private_key: /your/private/key.key

# Harbor 관리자 비밀번호
harbor_admin_password: Harbor12345  # 반드시 변경하세요!

# 데이터베이스 설정
database:
  password: root123  # 반드시 변경하세요!

# 데이터 저장 경로
data_volume: /data

# Clair 취약점 스캐너 (선택사항)
clair:
  updaters_interval: 12
      

⚠️ 주의: 실제 프로덕션 환경에서는 기본 비밀번호를 절대 사용하지 마세요! 강력한 비밀번호를 설정하고, HTTPS를 반드시 활성화하세요.

Harbor 설치하기

설정이 완료되면 설치 스크립트를 실행해요:


sudo ./install.sh --with-clair --with-trivy
    

설치가 완료되면 브라우저에서 http://your-server-ip 또는 https://registry.yourdomain.com으로 접속할 수 있어요. 기본 계정은 admin이고 비밀번호는 harbor.yml에서 설정한 값이에요.

🎉 축하해요! Harbor 레지스트리가 성공적으로 설치됐어요! 이제 웹 UI에서 프로젝트를 생성하고 사용자를 추가할 수 있어요.

Harbor 사용하기

Harbor에 이미지를 푸시하려면 먼저 Docker 클라이언트에서 로그인해야 해요:


# Harbor 로그인
docker login registry.yourdomain.com -u admin -p Harbor12345

# 이미지 태깅
docker tag nginx:latest registry.yourdomain.com/project-name/nginx:v1.0

# 이미지 푸시
docker push registry.yourdomain.com/project-name/nginx:v1.0
    

Harbor의 웹 UI는 정말 직관적이라 사용하기 쉬워요! ㅋㅋㅋ 프로젝트, 사용자, 레플리케이션 정책 등을 관리할 수 있어요. 특히 취약점 스캔 기능은 보안에 민감한 환경에서 정말 유용해요!

6. Docker Registry 직접 구축하기 🐳

Harbor가 너무 무거운가요? 더 가벼운 옵션을 원한다면 Docker에서 공식 제공하는 Registry를 사용할 수 있어요. 기능은 제한적이지만, 설치가 간단하고 리소스 요구사항이 적어요!

기본 Docker Registry 실행하기

가장 간단한 방법은 Docker Registry 이미지를 바로 실행하는 거예요:


docker run -d -p 5000:5000 --restart=always --name registry registry:2
    

이렇게 하면 http://localhost:5000에서 레지스트리가 실행돼요. 하지만 실제 환경에서는 인증과 TLS가 필요하죠!

인증 및 TLS 설정하기

Docker Compose를 사용해 좀 더 복잡한 설정을 관리해볼게요:

먼저 필요한 디렉토리를 만들어요:


mkdir -p ~/docker-registry/{data,auth,certs}
      

인증을 위한 비밀번호 파일을 생성해요:


docker run --rm --entrypoint htpasswd httpd:2 -Bbn username password > ~/docker-registry/auth/htpasswd
    

SSL 인증서가 있다면 ~/docker-registry/certs 디렉토리에 domain.crtdomain.key 파일을 복사하세요. 테스트용 자체 서명 인증서를 생성하려면:


openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout ~/docker-registry/certs/domain.key \
  -out ~/docker-registry/certs/domain.crt
    

이제 Docker Compose 파일을 만들어요:


# ~/docker-registry/docker-compose.yml
version: '3'

services:
  registry:
    image: registry:2
    ports:
      - "443:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
    volumes:
      - ./data:/var/lib/registry
      - ./auth:/auth
      - ./certs:/certs
    restart: always
    
  # 선택사항: 웹 UI 추가
  ui:
    image: joxit/docker-registry-ui:latest
    ports:
      - "80:80"
    environment:
      - REGISTRY_URL=https://registry:5000
      - REGISTRY_TITLE=My Docker Registry
      - NGINX_PROXY_PASS_URL=https://registry:5000
      - SINGLE_REGISTRY=true
    depends_on:
      - registry
    restart: always
    

Docker Compose로 서비스를 시작해요:


cd ~/docker-registry
docker-compose up -d
    

💡 팁: joxit/docker-registry-ui는 기본 Docker Registry에 웹 UI를 추가해주는 인기 있는 오픈소스 프로젝트예요. 2025년에도 여전히 활발하게 유지보수되고 있어요!

Docker Registry 사용하기

설정한 레지스트리에 이미지를 푸시하려면:


# 레지스트리 로그인
docker login your-server-ip:443 -u username -p password

# 이미지 태깅
docker tag nginx:latest your-server-ip:443/nginx:v1.0

# 이미지 푸시
docker push your-server-ip:443/nginx:v1.0
    

자체 서명 인증서를 사용하는 경우, Docker 클라이언트에서 안전하지 않은 레지스트리로 등록해야 할 수도 있어요:


# Docker 클라이언트 설정 파일 수정
sudo nano /etc/docker/daemon.json

# 다음 내용 추가
{
  "insecure-registries": ["your-server-ip:443"]
}

# Docker 재시작
sudo systemctl restart docker
    

Harbor보다는 기능이 제한적이지만, 간단한 프라이빗 레지스트리로는 충분히 좋은 선택이에요! 특히 리소스가 제한된 환경에서 유용하죠. 😊

7. 보안 설정 및 접근 제어 🔒

컨테이너 레지스트리는 코드가 담긴 이미지를 저장하기 때문에 보안이 정말 중요해요! 2025년 기준으로 꼭 적용해야 할 보안 설정들을 알아볼게요.

필수 보안 설정

  1. HTTPS 적용 - 모든 통신은 반드시 암호화해야 해요. Let's Encrypt로 무료 인증서를 발급받을 수 있어요.
  2. 강력한 인증 - 기본 HTTP 인증보다는 OAuth나 LDAP 같은 강력한 인증 방식을 사용하세요.
  3. RBAC(역할 기반 접근 제어) - 사용자마다 적절한 권한만 부여하세요. Harbor는 이 기능을 기본 제공해요.
  4. 이미지 스캐닝 - 취약점을 자동으로 스캔하는 기능을 활성화하세요. Harbor는 Trivy, Clair 등의 스캐너를 통합 지원해요.
  5. 이미지 서명 - Docker Content Trust나 Cosign을 사용해 이미지 무결성을 검증하세요.
컨테이너 레지스트리 보안 아키텍처 컨테이너 레지스트리 TLS/HTTPS 암호화 인증 (LDAP/OAuth/OIDC) 취약점 스캐닝 (Trivy/Clair) 개발자 CI/CD 파이프라인 Kubernetes Docker 호스트 방화벽 방화벽

Harbor의 보안 기능 활용하기

Harbor를 사용한다면 다음 보안 기능을 활성화하세요:

  1. 프로젝트 격리 - 각 팀이나 애플리케이션별로 별도의 프로젝트를 만들어 접근을 제한하세요.
  2. 이미지 서명 정책 - 서명되지 않은 이미지는 푸시하지 못하도록 설정하세요.
  3. 취약점 스캔 자동화 - 이미지가 푸시될 때마다 자동으로 스캔하도록 설정하세요.
  4. 이미지 보존 정책 - 오래된 이미지는 자동으로 삭제되도록 설정하세요.

🔥 2025년 보안 트렌드: SBOM(Software Bill of Materials)을 활용한 공급망 보안이 중요해지고 있어요. Harbor 2.10부터는 SBOM 생성 및 검증 기능이 강화됐어요!

네트워크 보안

컨테이너 레지스트리는 가능하면 내부망에서만 접근 가능하도록 설정하세요. 외부에서 접근이 필요하다면:

  1. VPN을 통해서만 접근하도록 설정
  2. IP 기반 접근 제한 적용
  3. WAF(웹 애플리케이션 방화벽) 설치
  4. API 요청 제한(Rate Limiting) 적용

보안은 한 번 설정하고 끝나는 게 아니라 지속적으로 관리해야 하는 과정이에요. 정기적인 보안 감사와 업데이트를 잊지 마세요! 🛡️

8. CI/CD 파이프라인 연동하기 🔄

컨테이너 레지스트리의 진정한 가치는 CI/CD 파이프라인과 연동될 때 빛을 발해요! 2025년 현재 가장 인기 있는 CI/CD 도구들과 연동하는 방법을 알아볼게요.

GitHub Actions와 연동하기

GitHub Actions는 2025년에도 여전히 인기 있는 CI/CD 도구예요. 레지스트리와 연동하는 워크플로우 예시를 볼게요:


# .github/workflows/docker-build-push.yml
name: Build and Push Docker Image

on:
  push:
    branches: [ main ]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to private registry
        uses: docker/login-action@v3
        with:
          registry: registry.yourdomain.com
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: registry.yourdomain.com/project-name/app-name:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
    

GitHub Secrets에 REGISTRY_USERNAMEREGISTRY_PASSWORD를 설정하는 것을 잊지 마세요!

GitLab CI/CD와 연동하기

GitLab을 사용한다면 .gitlab-ci.yml 파일로 쉽게 연동할 수 있어요:


# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: registry.yourdomain.com/project-name/app-name:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: docker:24.0
  services:
    - docker:24.0-dind
  before_script:
    - docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD registry.yourdomain.com
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main
    

GitLab CI/CD 변수에 REGISTRY_USERREGISTRY_PASSWORD를 설정하세요.

Jenkins와 연동하기

Jenkins는 여전히 많은 기업에서 사용하는 CI/CD 도구예요. Jenkinsfile 예시를 볼게요:


// Jenkinsfile
pipeline {
    agent {
        docker {
            image 'docker:24.0'
        }
    }
    environment {
        REGISTRY = 'registry.yourdomain.com'
        IMAGE_NAME = 'project-name/app-name'
        IMAGE_TAG = "${env.BUILD_NUMBER}"
        REGISTRY_CREDENTIALS = credentials('registry-credentials-id')
    }
    stages {
        stage('Build and Push') {
            steps {
                sh '''
                    docker login -u $REGISTRY_CREDENTIALS_USR -p $REGISTRY_CREDENTIALS_PSW $REGISTRY
                    docker build -t $REGISTRY/$IMAGE_NAME:$IMAGE_TAG .
                    docker push $REGISTRY/$IMAGE_NAME:$IMAGE_TAG
                '''
            }
        }
    }
}
    

Jenkins 자격 증명 저장소에 레지스트리 접근 정보를 추가하는 것을 잊지 마세요!

💡 2025년 트렌드: GitOps 방식의 CI/CD가 표준이 되고 있어요. ArgoCD나 Flux와 같은 도구를 사용해 Kubernetes에 자동 배포하는 방식이 인기 있어요!

이미지 태깅 전략

CI/CD 파이프라인에서 이미지를 어떻게 태깅할지도 중요한 결정이에요:

  1. 시맨틱 버전 - v1.2.3 형식으로 명확한 버전 관리
  2. Git 커밋 해시 - abc123f 형식으로 소스코드와 직접 연결
  3. 빌드 번호 - build-123 형식으로 CI/CD 빌드와 연결
  4. 환경별 태그 - dev, staging, prod 등 환경 구분

가장 추천하는 방식은 시맨틱 버전과 Git 커밋 해시를 함께 사용하는 거예요: v1.2.3-abc123f

CI/CD 파이프라인과 레지스트리를 잘 연동하면 개발자가 코드를 푸시하는 순간부터 컨테이너 이미지 빌드, 테스트, 배포까지 모든 과정이 자동화돼요. 개발 생산성이 정말 많이 향상된답니다! 🚀

9. 모니터링 및 유지보수 📊

레지스트리를 구축한 후에는 지속적인 모니터링과 유지보수가 필요해요. 2025년 기준으로 효과적인 모니터링 방법을 알아볼게요!

핵심 모니터링 지표

  1. 시스템 리소스 - CPU, 메모리, 디스크 사용량
  2. 네트워크 트래픽 - 초당 요청 수, 대역폭 사용량
  3. 응답 시간 - API 요청 지연 시간
  4. 오류율 - 실패한 푸시/풀 요청 비율
  5. 저장소 크기 - 전체 이미지 크기 및 증가율

Prometheus와 Grafana로 모니터링하기

2025년에도 여전히 가장 인기 있는 모니터링 스택은 Prometheus와 Grafana예요. Docker Compose로 간단히 설정할 수 있어요:


# docker-compose-monitoring.yml
version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    restart: always

  grafana:
    image: grafana/grafana:latest
    depends_on:
      - prometheus
    ports:
      - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=secure_password
    restart: always

volumes:
  grafana-storage:
    

Prometheus 설정 파일(prometheus.yml)도 필요해요:


# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'registry'
    static_configs:
      - targets: ['registry:5000']
    metrics_path: /metrics
    
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']
    

Harbor는 이미 Prometheus 메트릭을 제공하지만, 기본 Docker Registry는 추가 설정이 필요해요. node-exporter를 추가하면 호스트 시스템 메트릭도 수집할 수 있어요.

🔥 2025년 트렌드: OpenTelemetry를 사용한 통합 모니터링이 표준이 되고 있어요. 메트릭, 로그, 트레이스를 모두 한 곳에서 관리할 수 있어요!

알림 설정하기

문제가 발생했을 때 즉시 알림을 받을 수 있도록 설정하세요:

  1. 디스크 공간 부족 - 80% 이상 사용 시 알림
  2. 높은 오류율 - 오류율이 5% 이상일 때 알림
  3. 느린 응답 시간 - 응답 시간이 500ms 이상일 때 알림
  4. 서비스 다운 - 서비스가 응답하지 않을 때 즉시 알림

Grafana에서 Slack, Teams, 이메일 등으로 알림을 보내도록 설정할 수 있어요.

정기 유지보수 작업

레지스트리의 안정적인 운영을 위해 정기적으로 수행해야 할 작업들이에요:

  1. 가비지 컬렉션 - 사용하지 않는 레이어 정리
  2. 백업 - 정기적인 데이터 백업
  3. 보안 업데이트 - OS 및 소프트웨어 패치 적용
  4. 취약점 스캔 - 저장된 이미지의 정기적인 스캔
  5. 성능 튜닝 - 사용 패턴에 따른 리소스 조정

Harbor의 경우 가비지 컬렉션을 웹 UI에서 쉽게 실행할 수 있어요:


# 또는 CLI에서 실행
docker exec -it harbor-jobservice /harbor/bin/harbor_garbage_collection
    

기본 Docker Registry의 경우:


docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml
    

모니터링과 유지보수는 지루할 수 있지만, 장기적으로 안정적인 서비스를 위해 정말 중요해요! 자동화할 수 있는 부분은 최대한 자동화하세요. 😉

10. 마무리 및 추가 리소스 🎁

여기까지 클라우드 기반 컨테이너 레지스트리를 구축하는 방법을 알아봤어요! 이제 여러분도 나만의 Docker Hub 클론을 만들 수 있게 됐어요. 짝짝짝! 👏

요약

  1. 컨테이너 레지스트리는 도커 이미지를 저장하고 관리하는 저장소예요.
  2. 자체 레지스트리는 비용 절감, 보안 강화, 네트워크 성능 향상 등의 이점이 있어요.
  3. Harbor는 엔터프라이즈급 기능을 제공하고, Docker Registry는 가벼운 옵션이에요.
  4. 보안과 접근 제어는 레지스트리 구축 시 가장 중요한 고려사항이에요.
  5. CI/CD 파이프라인과의 연동으로 개발 워크플로우를 자동화할 수 있어요.
  6. 지속적인 모니터링과 유지보수로 안정적인 서비스를 유지하세요.

2025년 현재, 컨테이너 기술은 클라우드 네이티브 애플리케이션 개발의 핵심이 됐어요. 자체 컨테이너 레지스트리를 구축하면 개발 워크플로우를 더욱 효율적으로 만들 수 있어요! 🚀

재능넷에서는 이런 DevOps 관련 지식과 기술을 공유하고 거래할 수 있어요. 컨테이너 레지스트리 구축 경험이 있다면, 재능넷에서 다른 개발자들에게 도움을 줄 수도 있겠죠? 😊

추가 학습 리소스

  1. Harbor 공식 문서 - 최신 Harbor 기능과 설정 방법
  2. Docker Registry 공식 문서 - 기본 레지스트리 설정 가이드
  3. Joxit Registry UI - 기본 레지스트리용 웹 UI
  4. Prometheus 문서 - 모니터링 설정 가이드
  5. Grafana 튜토리얼 - 대시보드 구성 방법

"컨테이너는 코드를 패키징하는 방법을 바꿨고, 컨테이너 레지스트리는 그 패키지를 공유하는 방법을 바꿨습니다. 자체 레지스트리를 구축하는 것은 여러분의 개발 인프라에 대한 통제력을 높이는 중요한 단계입니다." - 어느 클라우드 아키텍트

여러분의 컨테이너 레지스트리 구축 여정이 순탄하길 바라요! 질문이나 도움이 필요하면 재능넷 커뮤니티에서 언제든지 물어보세요. 함께 성장해요! 화이팅! 💪

1. 컨테이너 레지스트리란 무엇인가요? 🤔

컨테이너 레지스트리는 쉽게 말해서 도커 이미지들의 저장소예요. 깃허브가 코드를 저장하는 곳이라면, 컨테이너 레지스트리는 도커 이미지를 저장하고 관리하는 곳이죠. 가장 유명한 건 Docker Hub지만, 요즘엔 GitHub Container Registry, AWS ECR, Google Container Registry 등 다양한 서비스가 있어요.

알고 계셨나요? 📢 2025년 기준으로 전 세계 기업의 약 87%가 컨테이너 기술을 활용하고 있으며, 이 중 65%는 프라이빗 레지스트리를 운영 중이라고 해요!

컨테이너 레지스트리 웹앱 v1.2 API v2.0 DB v1.0 백엔드 v3.1 프론트 v2.5 캐시 v1.1 Docker 클라이언트 push / pull

레지스트리는 단순히 이미지만 저장하는 게 아니라 버전 관리, 접근 제어, 취약점 스캔 같은 기능도 제공해요. 특히 기업 환경에서는 보안과 컴플라이언스 때문에 자체 레지스트리가 필수인 경우가 많죠! 🔒

2. 왜 직접 레지스트리를 구축해야 할까요? 🧐

Docker Hub 쓰면 되는데 왜 직접 만들어야 하냐고요? 진짜 좋은 질문이에요! ㅋㅋㅋ 여기 몇 가지 이유가 있어요:

  1. 비용 절감 - Docker Hub 프라이빗 저장소는 월 구독료가 있지만, 자체 레지스트리는 초기 구축 후 유지비만 들어요. 특히 이미지가 많고 크다면 장기적으로 더 경제적이죠!
  2. 데이터 주권 - 민감한 코드가 담긴 이미지를 외부 서비스에 저장하기 꺼려지는 경우가 있죠. 자체 레지스트리는 데이터가 내부망에 있어 보안이 강화돼요.
  3. 네트워크 성능 - 내부 네트워크에서 이미지를 주고받으면 외부 레지스트리보다 훨씬 빠르게 이미지를 배포할 수 있어요. CI/CD 파이프라인이 빨라지죠! 🚀
  4. 커스터마이징 - 회사나 팀에 필요한 기능을 직접 추가하거나 기존 시스템과 통합할 수 있어요.
  5. 인터넷 연결 없이 작동 - 폐쇄망 환경에서도 컨테이너 배포가 가능해져요.

"우리 회사는 자체 컨테이너 레지스트리를 구축한 후 배포 시간이 68% 단축됐어요. 개발자들이 '드디어 커피 한 잔 마실 시간도 없이 배포가 끝난다'고 투덜대더라고요! ㅋㅋ" - 어느 DevOps 엔지니어

재능넷에서도 개발자들을 위한 다양한 DevOps 관련 재능거래가 활발하게 이루어지고 있어요. 컨테이너 레지스트리 구축 경험이 있다면 좋은 부가수입이 될 수도 있죠! 😉

3. 필요한 기술 스택 살펴보기 💻

자체 레지스트리를 구축하려면 어떤 기술들이 필요할까요? 2025년 현재 가장 인기 있는 옵션들을 살펴볼게요!

1. Docker Registry (기본형) 🐳

Docker에서 공식 제공하는 오픈소스 레지스트리예요. 가장 기본적인 기능만 제공하지만, 간단하게 시작하기 좋아요.

장점: 설치가 쉽고, 리소스 요구사항이 적음

단점: UI가 없고, 고급 기능(취약점 스캔, RBAC 등)이 제한적

2. Harbor (엔터프라이즈급) 🚢

CNCF 졸업 프로젝트인 Harbor는 2025년 현재 가장 인기 있는 엔터프라이즈급 레지스트리예요. 웹 UI, RBAC, 이미지 스캔 등 풍부한 기능을 제공해요.

장점: 완전한 기능 세트, 활발한 커뮤니티, 엔터프라이즈 지원

단점: 설치와 구성이 복잡하고, 리소스 요구사항이 높음

3. Nexus Repository (통합형) 📦

Docker 이미지뿐만 아니라 npm, Maven 등 다양한 패키지도 함께 관리할 수 있는 통합 저장소예요.

장점: 다양한 패키지 타입 지원, 단일 관리 포인트

단점: Docker 전용 기능은 Harbor보다 제한적

4. GitLab Container Registry (통합형) 🦊

GitLab을 이미 사용 중이라면, 내장된 컨테이너 레지스트리를 활용할 수 있어요.

장점: GitLab과 완벽한 통합, CI/CD 파이프라인 연동 용이

단점: GitLab 없이는 사용 불가, 독립적인 확장이 어려움

이 글에서는 가장 많이 사용되는 Docker Registry와 Harbor를 중심으로 설명할게요. 두 가지 방식으로 구축하는 방법을 모두 알려드릴게요! 👍

🔥 2025년 트렌드 팁: 최근에는 GitOps 방식으로 레지스트리를 관리하는 추세예요. 인프라 코드를 Git으로 관리하면 변경 이력 추적과 롤백이 쉬워져요!

4. 클라우드 환경 구성하기 ☁️

레지스트리를 어디에 호스팅할지 결정해야 해요. 2025년 기준으로 가장 인기 있는 클라우드 옵션들을 살펴볼게요!

클라우드 환경 비교 AWS EKS + ECR 장점: - 높은 안정성 - 글로벌 인프라 - AWS 서비스 통합 단점: - 비용 관리 복잡 - 벤더 종속성 GCP GKE + Artifact Registry 장점: - Kubernetes 친화적 - 빠른 네트워크 - 머신러닝 통합 단점: - 일부 지역 제한 - 학습 곡선 Azure AKS + ACR 장점: - 기업 친화적 - MS 제품 통합 - 하이브리드 클라우드 단점: - 복잡한 가격 체계 - 일부 서비스 성숙도 On-Premise K8s + 자체 레지스트리 장점: - 완전한 제어 - 데이터 주권 - 장기적 비용 절감 단점: - 초기 투자 비용 - 유지보수 부담 2025년 기준 클라우드 환경별 컨테이너 레지스트리 구축 옵션

이 글에서는 AWS를 기준으로 설명할게요. AWS는 ECR(Elastic Container Registry)이라는 관리형 레지스트리 서비스를 제공하지만, 우리는 직접 구축하는 방법을 알아볼 거예요!

AWS 환경 준비하기

먼저 EC2 인스턴스를 준비해볼게요. 레지스트리 용도로는 다음 사양이 적당해요:

  • ✅ t3.medium 이상 (2 vCPU, 4GB RAM)
  • ✅ 최소 100GB 스토리지 (이미지 크기에 따라 조정)
  • ✅ Ubuntu 22.04 LTS 또는 Amazon Linux 2023
  • ✅ 보안그룹: 80/443(HTTP/HTTPS), 22(SSH), 5000(Registry) 포트 오픈

EC2 인스턴스에 접속한 후, 기본 패키지를 업데이트하고 Docker를 설치해요:


# Ubuntu 기준
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-compose
sudo usermod -aG docker $USER
      

Docker Compose도 필요해요. 2025년 기준 최신 버전을 설치해볼게요:


# Docker Compose 설치 (v2.x)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
    

여기서 잠깐! 💡 프로덕션 환경에서는 반드시 도메인과 SSL 인증서를 준비하세요. Let's Encrypt로 무료 인증서를 발급받을 수 있어요.

5. Harbor 기반 레지스트리 구축하기 🚢

Harbor는 CNCF의 졸업 프로젝트로, 엔터프라이즈급 컨테이너 레지스트리예요. 웹 UI, RBAC(역할 기반 접근 제어), 취약점 스캔, 복제 등 다양한 기능을 제공해요. 2025년 현재 가장 인기 있는 오픈소스 레지스트리 솔루션이죠!

Harbor 설치 준비

먼저 Harbor 설치 파일을 다운로드해요. 2025년 3월 기준 최신 버전은 v2.10.x예요:


# Harbor 다운로드
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
tar xzvf harbor-online-installer-v2.10.0.tgz
cd harbor
    

설치 전에 harbor.yml.tmpl 파일을 harbor.yml로 복사하고 설정을 수정해야 해요:


cp harbor.yml.tmpl harbor.yml
nano harbor.yml
    

주요 설정 항목은 다음과 같아요:


# harbor.yml 주요 설정
hostname: registry.yourdomain.com  # 여러분의 도메인으로 변경하세요

# http 관련 설정
http:
  port: 80

# https 관련 설정 (프로덕션에서는 반드시 활성화하세요)
https:
  port: 443
  certificate: /your/certificate/path.crt
  private_key: /your/private/key.key

# Harbor 관리자 비밀번호
harbor_admin_password: Harbor12345  # 반드시 변경하세요!

# 데이터베이스 설정
database:
  password: root123  # 반드시 변경하세요!

# 데이터 저장 경로
data_volume: /data

# Clair 취약점 스캐너 (선택사항)
clair:
  updaters_interval: 12
      

⚠️ 주의: 실제 프로덕션 환경에서는 기본 비밀번호를 절대 사용하지 마세요! 강력한 비밀번호를 설정하고, HTTPS를 반드시 활성화하세요.

Harbor 설치하기

설정이 완료되면 설치 스크립트를 실행해요:


sudo ./install.sh --with-clair --with-trivy
    

설치가 완료되면 브라우저에서 http://your-server-ip 또는 https://registry.yourdomain.com으로 접속할 수 있어요. 기본 계정은 admin이고 비밀번호는 harbor.yml에서 설정한 값이에요.

🎉 축하해요! Harbor 레지스트리가 성공적으로 설치됐어요! 이제 웹 UI에서 프로젝트를 생성하고 사용자를 추가할 수 있어요.

Harbor 사용하기

Harbor에 이미지를 푸시하려면 먼저 Docker 클라이언트에서 로그인해야 해요:


# Harbor 로그인
docker login registry.yourdomain.com -u admin -p Harbor12345

# 이미지 태깅
docker tag nginx:latest registry.yourdomain.com/project-name/nginx:v1.0

# 이미지 푸시
docker push registry.yourdomain.com/project-name/nginx:v1.0
    

Harbor의 웹 UI는 정말 직관적이라 사용하기 쉬워요! ㅋㅋㅋ 프로젝트, 사용자, 레플리케이션 정책 등을 관리할 수 있어요. 특히 취약점 스캔 기능은 보안에 민감한 환경에서 정말 유용해요!