우와한 개발자

[Docker] Docker Registry란? private registry 구축하기

by 우와한개발자

[Docker Registry]

1. Docker registry란?

  • docker 이미지를 저장하고 관라하는 저장소 역할
  • docker 이미지 재사용 및 배포 용이하도록 하는 인프라

1) Docker registry 종류

레지스트리 운영 주체 특징 요금/유형
Docker Hub Docker Inc. 가장 많이 사용되는 공용 레지스트리, 공개 이미지와 사설 저장소 제공 무료 / 유료
Amazon ECR AWS AWS 서비스(ECS, EKS 등)와 쉽게 연동되는 레지스트리 종량제
Google Container Registry (GCR) Google GCP 및 Kubernetes(GKE)와 연동 종량제
Azure Container Registry (ACR) Microsoft Azure DevOps, Azure AD 인증과 연동 종량제
GitLab Container Registry GitLab GitLab CI/CD 파이프라인과 통합된 레지스트리 무료 / 유료
Docker Distribution Docker Inc. 직접 구축 가능한 오픈소스 Docker 레지스트리 무료 (자가 호스팅)

 

2) Docker registry 구성 요소

구성 요소 개념 역할 / 특징
레지스트리 (Registry) 이미지를 저장하고 배포하는 서버 docker push, docker pull 요청을 처리
리포지토리 (Repository) 같은 애플리케이션 이미지 모음 여러 버전(Tag)을 함께 관리
이미지 (Image) 컨테이너 실행에 필요한 패키지 여러 레이어로 구성된 실행 환경
레이어 (Layer) 이미지 구성 단위 Dockerfile 명령어마다 생성되는 계층
매니페스트 (Manifest) 이미지 정보가 담긴 JSON 메타데이터 이미지 레이어 목록과 설정 정보 포함
태그 (Tag) 이미지 버전 식별자 latest, v1.0 등
스토리지 백엔드 이미지 파일 저장소 로컬 파일 시스템, S3 등 사용 가능
인증 및 권한 레지스트리 접근 제어 Basic Auth, Token, OAuth 등
보안 통신 HTTPS 기반 통신 TLS/SSL로 이미지 전송 보호
API / 카탈로그 레지스트리 REST API 이미지 조회, push/pull 관리
웹훅 / 알림 이벤트 알림 기능 이미지 push 시 CI/CD 트리거 가능

 

⚠️ registry와 repository
Registry
 ├── repository: nginx
 │     ├── tag: latest
 │     └── tag: 1.25
 │
 ├── repository: myapp
 │     ├── tag: v1
 │     └── tag: v2
 │
 └── repository: backend
       └── tag: 1.0​
# Docker 이미지 이름 구조
[Registry]/[Repository]:[Tag] 

#예시 localhost:5000/mynginx:mytag yunyeook/mynginx:latest

 

2. Docker Registry 생성

  • Docker Registry는 오픈소스 플랫폼으로 제공되는 이미지 저장소 서비스
  • Docker Hub와 같은 공개 레지스트리뿐만 아니라 개인이 직접 Private Registry를 생성하여 운영가능

 

1) Docker Registry Container를 이용한 Registry 생성

(1) 이미지가 저장될 디렉토리 생성

sudo mkdir -p /opt/registry_data  
옵션 설명
mkdir -p 디렉토리가 없으면 생성
/opt/registry_data 레지스트리 이미지가 저장될 디렉토리

 

(2) Docker Registry 이미지 다운로드 및 실행

docker pull registry:2

docker run -d -p 5000:5000 --name my-registry \
 -v /opt/registry_data:/var/lib/registry \
 -e REGISTRY_STORAGE_DELETE_ENABLED=true \
 registry:2

 

옵션 의미
-d 백그라운드 실행
-p 5000:5000 호스트와 컨테이너 포트 연결
--name my-registry 컨테이너 이름
-v /opt/registry_data:/var/lib/registry 레지스트리 데이터 저장 디렉토리 마운트
REGISTRY_STORAGE_DELETE_ENABLED=true 레지스트리 이미지 삭제 기능 활성화
registry:2 Docker 공식 Registry 이미지
⚠️ REGISTRY_STORAGE_DELETE_ENABLED=true 
- 기본적으로 도커 레지스트리 컨테이너는 이미지 삭제를 비활성화해 놓아서 레지스트리에 올려진 이미지를 삭제 사용하려면, REGISTRY_STORAGE_DELETE_ENABLED=true 환경설정 추가

 

(3) Registry 동작 확인

sudo apt install curl
curl <http://localhost:5000/v2/_catalog>

# 실행 결과 예시
{ "repositories": []}

 

항목 설명
/v2/_catalog 레지스트리에 저장된 이미지 목록 조회
Docker Registry HTTP API v2 레지스트리 API 규격

 

⚠️ CLI 에서 백슬래시(\)
- 명령어를 여러 줄로 나누어 작성할 때 사용

 

⚠️curl?
- 리눅스 터미널에서 HTTP 요청을 보내기 위해 사용하는 네트워크 명령어 도구
- REST API 테스트, HTTP 요청 전송, 서버 상태 확인 등에 사용

 

2) 기존 이미지를 이름 변경 후 Registry에 Push

  • Docker Registry에 이미지를 업로드하려면 이미지 이름을 레지스트리 주소 형식으로 변경(tag) 해야 함
docker tag jinkyoungheo/mynginx:latest localhost:5000/mynginx:mytag
docker push localhost:5000/mynginx:mytag

# 레지스트리에 push한 이미지 확인하기 위한 요청
curl -X GET <http://localhost:5000/v2/_catalog> 

 

3) 로컬 이미지 삭제 후 Registry에서 Pull

 docker rmi localhost:5000/mynginx:mytag
 docker rmi jinkyoungheo/mynginx:latest
 
 #Registry에서 이미지 다운로드
 docker pull localhost:5000/mynginx:mytag
 docker images

 

4) Registry에 저장된 이미지 삭제

  • Docker Registry에서 이미지를 삭제하려면 이미지 Docker-Content-Diges 값을 이용해야함

(1) 이미지 Docker-Content-Digest 조회

curl-X GET-I \
-H"Accept: application/vnd.docker.distribution.manifest.v2+json" \
<http://localhost:5000/v2/mynginx/manifests/mytag>

 

(2) 이미지 삭제

curl-X DELETE \
<http://localhost:5000/v2/mynginx/manifests/sha256:xxxxxxxxxxxxxxxx>
옵션 설명
-I 헤더 정보만 요청
-H HTTP 헤더 전달
DELETE 이미지 삭제 요청
⚠️ 이미지 삭제시 카탈로그 조회
- 이미지를 삭제하더라도 curl -X GET http://localhost:5000/v2/_catalog 하면 결과가 보이긴 하지만 실제로 docker pull은 불가
- 실제 저장 공간을 정리하려면 Registry GC(Garbage Collection)실행 해야함.

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기