[Docker 입문] Registry & Repository

[2024] 처음 시작하는 도커와 컨테이너 [천강민] 강의 수강 후 정리한 내용입니다.

 

처음 시작하는 도커와 컨테이너 강의 | 천강민 - 인프런

천강민 | , 실무에서, '도커 잘하네!' 라는 얘기가 나오도록 짧고 굵게![사진]실제 서비스 제공을 기반으로 고민하며 해결할 수 있다면, 이 강의는 수강하지 마세요.실무 요구사항을 해결해보는

www.inflearn.com

 

레지스트리와 레포지터리

 

 

레지스트리는 컨테이너 이미지를 저장하는 공간으로, 쉽게 말해 컨테이너 이미지 저장소이다.

 

가장 많이 사용되는 레지스트리 중 하나가 Docker Hub이며, 많은 사람들이 컨테이너 이미지를 찾고 공유하는 대표적인 플랫폼이다.

 

레지스트리 내부에는 레포지토리(repository)가 존재하는데, 이것은 특정 애플리케이션이나 프로젝트와 관련된 컨테이너 이미지들의 모음이다. 예를 들어, Nginx 레포지토리에는 Nginx와 관련된 다양한 버전의 이미지들이 저장되어 있다.

 

컨테이너 이미지를 사용할 때는 nginx:별칭과 같은 형식을 사용하여, 콜론(:) 뒤에 특정 태그(별칭 또는 버전)를 지정할 수 있다.

 

별칭을 지정하지 않으면, 기본적으로 latest 태그가 자동으로 붙는다. 이는 해당 레포지토리에서 가장 최신 버전의 이미지를 의미한다.

 

 

Docker Hub에서 nginx를 검색하면 기본적으로 세 가지 유형의 이미지가 존재한다.

 

1. Docker Official Image : Docker에서 공식적으로 제공하고 공인한 이미지

2. Verified Publisher : 특정 공급자가 배포하며, Docker에서 인증을 받은 공식 이미지

3. Sponsored OSS : Docker가 후원하는 오픈 소스 프로젝트의 이미지

 

 

Docker Hub에서 특정 이미지의 상세 페이지로 들어가면, 해당 이미지에 대한 기본적인 설명과 함께 이미지를 가져오고 사용하는 방법이 제공된다.

 

일반적으로 PULL 또는 PUSH 명령어를 사용해 이미지를 직접 다운로드하거나 업로드할 수 있지만, RUN 명령어를 실행하면 별도로 PULL하지 않아도 자동으로 필요한 이미지를 다운로드해 실행할 수 있다.

 

Private Registry 생성 및 활용

 

레지스트리를 직접 운영할 수도 있으며, 이를 Private Registry라고 한다.

 

Private Registry는 docker pull  docker push 명령어를 사용하여 이미지를 업로드하고 다운로드할 수 있다.

 

기본적인 이미지 다운로드 예시

docker pull docker.io/library/nginx:latest
docker pull docker.io/grafana/grafana:latest
docker pull ubuntu@sha256:26c68657ccce2c…
docker pull ghcr.io/~

 

기본적으로 NAME만 사용하여 이미지를 가져오지만, 실제로는 SERVER[:PORT][/NAMESPACE/]NAME[:TAG|@DIGEST]형식을 따른다. 예를 들어, GitHub에서 제공하는 컨테이너 레지스트리의 경우 ghcr.io와 같은 서버 URL이 포함될 수 있다.

 

 

Private Registry 아키텍처

 

레지스트리 자체는 docker push docker pull을 통해 이미지를 저장하고 가져오는 것이 가능하다.

 

하지만 레지스트리에 어떤 이미지가 저장되어 있는지를 확인하려면 직접 HTTP 요청을 보내야 하는 불편함이 있다. 이를 해결하기 위해 docker-registry-ui라는 도구를 사용할 수 있다.

 

docker-registry-ui

  • 웹 인터페이스를 제공하여 저장된 컨테이너 이미지를 쉽게 확인할 수 있도록 한다.
  • nginx를 통해 컨텐츠를 사용자에게 전달한다. nginx라는 웹 서버가 이 웹 페이지를 사용자에게 전달하는 역할을 한다.
  • CORS(Cross-Origin Resource Sharing) 설정이 필요할 수 있다.

 

웹 인터페이스가 제공되면 사용자는 브라우저를 통해 직접 레지스트리를 확인할 수 있지만, CORS 정책으로 인해 브라우저에서 다른 서버의 데이터를 가져오는 것이 제한될 수 있다. 이를 해결하려면 적절한 환경 변수를 설정해야 한다.

 

  •  

cf) 익명 볼륨(Anonymous Volume)

 

익명 볼륨은 Docker에서 데이터를 임시로 저장할 때 사용하는 공간이다. 컨테이너를 생성할 때 자동으로 생성되며, 컨테이너가 종료되면 익명 볼륨도 함께 사라질 수 있다.

 

Dockerfile을 설정하면 사용자가 직접 볼륨을 만들지 않더라도 컨테이너가 필요한 볼륨을 생성하도록 지정할 수 있다. 이를 활용하면 컨테이너가 여러 번 생성되고 종료되더라도 데이터가 유지될 수 있다.

 


 

레지스트리는 컨테이너 이미지를 저장하고 관리하는 공간이며, 이를 통해 이미지를 쉽게 배포하고 활용할 수 있다. Docker Hub뿐만 아니라 Private Registry를 운영할 수도 있으며, UI 도구를 활용하면 더욱 편리하게 레지스트리를 관리할 수 있다. 또한, 익명 볼륨을 활용하여 컨테이너의 데이터 관리도 효과적으로 수행할 수 있다.

 

실습

# docker run --rm -d -p 1111:5000 --name registry-srv \
#   -e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin="['*']" \
#   -e REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers="[Docker-Content-Digest]" \
#   -e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods="[HEAD,GET,OPTIONS,DELETE]" \
#   -e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers="[Authorization,Accept,Cache-Control]" registry

# 위 명령과 동일
docker run -d -p 1111:5000 --name registry-srv \
  --env-file .env.dev registry

# 레포지토리 목록 보기
curl http://localhost:1111/v2/_catalog

docker run --rm -d -p 8080:80 --name registry-ui \
  -e REGISTRY_URL=http://localhost:1111 \
  -e SINGLE_REGISTRY=true joxit/docker-registry-ui

# 컨테이너 현황
docker ps

# 이미지 현황
docker images

# private registry 푸시하기 위해 이름 변경
docker tag registry localhost:1111/registry:v0.0.1
# private registry 푸시
docker push localhost:1111/registry:v0.0.1
# 로컬로 가져오기(이미 존재해서 바로 종료됨)
docker pull localhost:1111/registry:v0.0.1

########## 이미지를 제외한 초기화 명령어 ##########
# 모든 컨테이너 삭제
docker rm -f $(docker ps -a -q)

# 모든 볼륨 삭제
docker volume rm -f $(docker volume ls -q)

# 기본 네트워크 제외한 커스텀 네트워크 삭제
docker network rm -f $(docker network ls -q)

# 빌드 과정 중 발생한 모든 캐시 삭제
docker builder prune -a -f

# Images를 제외하고 모두 0으로 나오면 초기화 완료
docker system df
# .env.dev 파일
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin=['*']
REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers=[Docker-Content-Digest]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods=[HEAD,GET,OPTIONS,DELETE]
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers=[Authorization,Accept,Cache-Control]

 

  • -e 옵션을 사용하여 여러 개의 환경변수를 전달할 수도 있지만, 이는 다소 복잡할 수 있다.
  • 이를 해결하기 위해 --env-file 옵션을 사용하면 환경변수를 파일 형태로 전달할 수 있다.
  • 환경변수 파일은 key=value 형식으로 저장된다.
  • 예를 들어, Private Registry 이미지를 받아와 1111번 포트로 접근하면 내부적으로 5000번 포트로 전달되도록 설정할 수 있다. 이를 백그라운드 컨테이너로 실행할 수 있다.

 

  • 현재 UI가 없기 때문에 레포지터리의 상태를 확인하려면 curl 명령어를 사용해야 한다.
  • 하지만 아직 push 또는 pull 작업을 수행하지 않았기 때문에 아무런 결과도 출력되지 않는다.

 

  • 실제 레지스트리 URL은 http://localhost:1111이며, 이 값을 환경변수로 전달해야 한다.
  • 또한, 레지스트리는 하나만 존재하기 때문에 SINGLE_REGISTRY=true 값을 설정한다.

 

  • 컨테이너 상태를 확인하면 현재 2개의 컨테이너가 실행 중임을 확인할 수 있다.

 

  • Docker Registry UI를 사용하여 웹 브라우저에서 레지스트리의 내용을 확인할 수 있다.
  • UI를 제공하는 컨테이너는 8080번 포트에서 실행되므로, http://localhost:8080으로 접근하면 docker-registry-ui 화면이 나타난다.
  • 하지만 아직 push를 수행한 적이 없기 때문에 레포지터리가 존재하지 않는다.

 

  • tag 옵션을 사용하면 동일한 이미지를 다른 이름으로 지정할 수 있다.
  • 예를 들어, localhost:1111 포트에 registry라는 레포지터리를 생성하고, 태그를 v0.0.1로 지정할 수 있다.
  • 명령어 실행 후 이미지 목록을 확인하면, 동일한 이미지 ID를 가지지만 이름이 다른 두 개의 이미지가 존재함을 알 수 있다.

 

  • 이미지를 push한 후 웹 UI에서 새로고침하면 해당 레지스트리가 표시된다.특
  • 히, Mac M 시리즈 칩을 사용하는 경우 자동으로 arm64 아키텍처의 이미지가 생성된다.
  • 반면, 인텔 기반 CPU를 사용하고 있다면 AMD 아키텍처로 표시된다.

 

환경변수를 활용한 Private Registry 설정, UI 없이 레지스트리 확인하는 방법, 그리고 이미지 태깅 및 푸시 과정까지 정리했다.