본문 바로가기

운영체제 및 플랫폼/Docker(도커)

컨테이너 레지스트리란? Docker Hub와 GHCR로 이미지 저장·공유하기

728x90
반응형

한 줄 요약

컨테이너 레지스트리는 도커 이미지를 저장하고 공유하는 저장소예요. 이미지를 레지스트리에 올려 두면 다른 서버에서 같은 이미지를 내려받아 실행할 수 있어요.

컨테이너 레지스트리란


1. 핵심 개념

1.1 컨테이너 레지스트리란

공식 문서는 이미지 레지스트리를 컨테이너 이미지를 저장하고 공유하는 중앙 저장소로 정의해요. 공개(public) 또는 비공개(private)로 운영할 수 있어요.

Docker Hub는 누구나 쓸 수 있는 공개 레지스트리이고, 도커의 기본 레지스트리예요.

 

1.2 레지스트리, 리포지토리, 태그

세 용어는 비슷해 보이지만 범위가 달라요.

용어 의미
레지스트리(registry) 이미지를 저장·관리하는 서비스 전체예요 (예: Docker Hub)
리포지토리(repository) 레지스트리 안에서 관련 이미지를 모아 둔 단위예요 (예: myapp)
태그(tag) 같은 리포지토리 안에서 버전이나 종류를 구분하는 이름이에요 (예: 1.0)

 

1.3 왜 중요한가

  • 내 컴퓨터에서 만든 이미지를 서버로 옮기는 표준 경로예요.
  • CI/CD 파이프라인이 만든 이미지를 보관하는 장소예요.
  • 태그로 버전을 관리해 이전 버전으로 되돌리기 쉬워요.

2. 쉽게 이해하기

레지스트리를 도서관에 비유해 볼게요.

  • 레지스트리는 도서관 건물이에요.
  • 리포지토리는 책 한 종류가 꽂힌 서가예요.
  • 태그는 "개정 2판" 같은 판 표시예요.
  • 다이제스트는 책 내용 전체로 만든 지문이에요. 내용이 한 글자라도 다르면 지문이 달라져요.

3. 이미지 이름 읽는 법

공식 문서 기준 이미지 이름의 구조는 이래요.

[호스트[:포트]/]네임스페이스/리포지토리[:태그]
예시 호스트 네임스페이스 리포지토리 태그
alpine docker.io (기본값) library (기본값) alpine latest (기본값)
example.com:5000/team/my-app:2.0 example.com team my-app 2.0
ghcr.io/<계정>/myapp:1.0 ghcr.io <계정> myapp 1.0
  • 호스트를 생략하면 Docker Hub(docker.io)로 해석돼요.
  • 네임스페이스를 생략하면 공식 이미지용 library로 해석돼요.
  • 태그를 생략하면 latest로 해석돼요.

 

3.1 latest는 "최신"이라는 뜻이 아니에요

latest는 태그를 생략했을 때 쓰이는 기본 이름이에요. 가장 최근 버전을 자동으로 가리키는 기능은 없어요. 운영 환경에서는 1.0처럼 명확한 태그를 쓰는 편이 안전해요.

 

3.2 다이제스트로 고정하기

태그는 다른 이미지를 가리키도록 바뀔 수 있어요. 내용 기준으로 고정하려면 다이제스트를 써요.

docker pull alpine@sha256:<다이제스트 값>

다이제스트(digest): 이미지 내용으로 계산한 고유 식별값이에요. 내용이 같으면 값도 같아요.


4. Docker Hub에 이미지 올리기

# 1) 로그인
docker login

# 2) 레지스트리 형식에 맞게 태그 붙이기
docker tag myapp:1.0 <Docker Hub 사용자명>/myapp:1.0

# 3) 업로드
docker push <Docker Hub 사용자명>/myapp:1.0

# 4) 다른 서버에서 내려받기
docker pull <Docker Hub 사용자명>/myapp:1.0

 

docker tag는 이미지를 복사하지 않아요. 같은 이미지에 이름을 하나 더 붙이는 명령이에요.


5. GitHub Container Registry(GHCR)에 이미지 올리기

GHCR은 GitHub이 제공하는 컨테이너 레지스트리예요. 주소는 ghcr.io예요.

 

5.1 인증 준비

공식 문서는 명령줄에서 로그인할 때 personal access token (classic) 사용을 안내해요. 권한(scope)은 용도에 맞게 선택해요.

  • read:packages: 이미지 내려받기
  • write:packages: 이미지 올리기

 

5.2 업로드 절차

# 토큰을 환경 변수로 저장한 뒤 로그인
export CR_PAT=<발급받은 토큰>
echo $CR_PAT | docker login ghcr.io -u <GitHub 사용자명> --password-stdin

# 태그 붙이기
docker tag myapp:1.0 ghcr.io/<계정 또는 조직>/myapp:1.0

# 업로드
docker push ghcr.io/<계정 또는 조직>/myapp:1.0

 

--password-stdin을 쓰면 토큰이 명령 기록(history)에 남지 않아요.

 

5.3 공개 범위

공식 문서에 따르면 패키지를 처음 올리면 기본 공개 범위는 비공개(private)예요. 공개로 바꾸려면 패키지 설정에서 변경해요.


6. 핵심 정리

  • 컨테이너 레지스트리는 이미지를 저장하고 공유하는 중앙 저장소예요.
  • 레지스트리 > 리포지토리 > 태그 순서로 범위가 좁아져요.
  • 호스트를 생략하면 Docker Hub, 태그를 생략하면 latest로 해석돼요.
  • latest는 기본 이름일 뿐이에요. 운영에서는 버전 태그나 다이제스트를 써요.
  • GHCR은 ghcr.io 주소를 쓰고, 첫 업로드 시 기본 비공개예요.

7. 추가 정보

다른 레지스트리

공식 문서는 Docker Hub 외에도 클라우드 사업자의 레지스트리(Amazon ECR, Azure Container Registry 등)와 직접 운영하는 레지스트리(Harbor, GitLab Container Registry 등)를 예로 들어요.

 

주의사항

  • 이미지 안에 비밀번호나 키를 넣지 마세요. 이미지에 접근 권한이 있는 사람은 내용을 확인할 수 있어요.
  • 리포지토리 이름은 소문자로 작성해요. 대문자가 섞이면 이미지 이름 형식 오류가 발생해요.
  • Docker Hub에는 요청 횟수 제한이 있어요. 구체적인 한도는 요금제에 따라 달라지므로 공식 문서에서 확인하세요.
반응형