docker pull nginx를 입력하면 어디선가 이미지가 내려옵니다. 그 "어딘가"가 바로 **도커 레지스트리(registry)**입니다. 레지스트리는 도커 이미지를 보관하고 배포하는 저장소 서버입니다. 깃허브가 코드 저장소라면, 레지스트리는 이미지 저장소인 셈입니다. 동작 원리를 알면 이미지를 어떻게 공유하고 배포 파이프라인을 어떻게 짜는지가 보입니다.
레지스트리·리포지터리·태그
용어가 헷갈리기 쉬운데, 세 계층으로 나뉩니다. 레지스트리는 서버 전체(예: Docker Hub), 리포지터리는 한 이미지의 이름 단위(예: nginx), 태그는 그 안의 버전(예: 1.25)입니다.
| 구성요소 | 의미 | 예시 |
|---|---|---|
| 레지스트리 | 이미지 저장 서버 | docker.io, registry.mycorp.com |
| 리포지터리 | 한 이미지의 이름 공간 | library/nginx |
| 태그 | 리포지터리 안의 특정 버전 | nginx:1.25 |
| 다이제스트 | 내용 기반 고유 해시 | nginx@sha256:abc... |
push와 pull의 흐름
이미지 이름은 사실 레지스트리/리포지터리:태그 구조입니다. nginx처럼 짧게 쓰면 도커가 docker.io/library/nginx:latest로 자동 해석합니다. 직접 만든 이미지를 올리려면 레지스트리 주소를 붙여 태그하고 push합니다.
docker tag myapp:1.0 registry.mycorp.com/team/myapp:1.0
docker push registry.mycorp.com/team/myapp:1.0
docker pull registry.mycorp.com/team/myapp:1.0
push할 때는 이미지를 구성하는 레이어를 하나씩 올리는데, 레지스트리에 이미 있는 레이어는 건너뜁니다. pull도 마찬가지로 로컬에 없는 레이어만 내려받습니다. 그래서 같은 베이스를 쓰는 이미지는 전송량이 크게 줄어듭니다.
태그보다 다이제스트가 정확하다
latest 같은 태그는 가리키는 대상이 언제든 바뀔 수 있습니다. 어제의 myapp:latest와 오늘의 myapp:latest가 다른 이미지일 수 있다는 뜻입니다. 반면 다이제스트(@sha256:...)는 내용이 같으면 항상 같은 값이라, 운영 환경에서 정확히 같은 이미지를 보장하려면 다이제스트로 고정합니다.
docker inspect --format '{{index .RepoDigests 0}}' nginx:1.25
프라이빗 레지스트리와 인증
회사 내부 이미지는 공개 Docker Hub에 두면 안 되므로 프라이빗 레지스트리(Harbor, AWS ECR, GitHub Container Registry 등)를 씁니다. push/pull 전에 docker login으로 인증해야 하며, 쿠버네티스에서는 imagePullSecret으로 같은 자격을 전달합니다.
요점 정리
- 레지스트리는 도커 이미지를 보관·배포하는 저장소 서버다.
- 이미지 이름은
레지스트리/리포지터리:태그구조이며 짧은 이름은 자동 해석된다. - push/pull은 이미 존재하는 레이어를 건너뛰어 전송량을 줄인다.
- 운영에서 동일 이미지를 보장하려면 태그 대신 다이제스트로 고정한다.
이미지를 직접 태그하고 레지스트리에 push·pull 해보는 실습은 도커 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.