컨테이너 이미지를 빌드했다면 어딘가에 저장하고 팀과 공유해야 한다. Docker Hub는 Docker가 공식 운영하는 클라우드 기반 Registry로, 수백만 개의 공개 이미지가 올라와 있고 Private Repository도 제공한다. 로컬에서 빌드한 이미지를 Hub에 올리는 것만으로 어느 환경에서든 동일한 컨테이너를 실행할 수 있다.
Registry는 컨테이너 이미지를 저장·배포하는 서버다. Docker CLI는 기본적으로 registry-1.docker.io(Docker Hub)를 바라본다.
[로컬 Docker Engine]
|
docker push / pull
|
┌────────────────────────────────┐
│ Docker Hub │
│ ┌──────────┐ ┌────────────┐ │
│ │ Public │ │ Private │ │
│ │ Repo │ │ Repo │ │
│ └──────────┘ └────────────┘ │
└────────────────────────────────┘
Registry — 이미지 레이어를 저장하고 태그별로 버전을 관리하는 원격 저장소. Docker Hub 외에 AWS ECR, GCR, GHCR 등이 있다.
| 구분 | Public | Private |
|---|---|---|
| 열람 권한 | 누구나 pull 가능 | 인증된 사용자만 |
| 무료 플랜 | 무제한 | 1개 |
| 주요 용도 | 오픈소스 배포 | 사내 서비스 이미지 |
무료 계정은 Private Repository를 1개만 만들 수 있다. 팀 규모가 커지면 AWS ECR 또는 유료 플랜 전환을 검토해야 한다.
# Docker Hub 로그인
docker login
# 이미지 빌드 — 이름은 반드시 <username>/<repo>:<tag> 형식
docker build -t myuser/myapp:1.0.0 .
# Hub에 업로드
docker push myuser/myapp:1.0.0
# latest 태그도 함께 올리는 경우
docker tag myuser/myapp:1.0.0 myuser/myapp:latest
docker push myuser/myapp:latest
docker login은 자격증명을 ~/.docker/config.json에 저장한다. CI 환경에서는 DOCKER_USERNAME / DOCKER_PASSWORD 환경 변수와 docker login -u $DOCKER_USERNAME --password-stdin을 조합해 사용한다.
태그는 이미지의 버전을 식별하는 문자열이다. latest만 사용하면 어떤 코드가 배포됐는지 추적이 어렵다.
myuser/myapp:1.0.0 ← SemVer — 프로덕션 릴리스
myuser/myapp:1.0.0-rc1 ← 릴리스 후보
myuser/myapp:sha-a3f9c2 ← Git 커밋 해시 — CI에서 자동 생성
myuser/myapp:latest ← 최신 stable 가리키는 포인터
CI/CD 파이프라인에서는 Git 커밋 해시를 태그로 사용하면 배포 이미지와 소스코드를 1:1로 연결할 수 있다.
| 항목 | Docker Hub | AWS ECR |
|---|---|---|
| 인증 | Docker 계정 | IAM Role / Access Key |
| 네트워크 비용 | 인터넷 경유 | VPC 내부 전송 무료 |
| 스캔 기능 | 기본 취약점 스캔 | ECR Enhanced Scanning |
| 적합한 상황 | 오픈소스·소규모 팀 | AWS 인프라 중심 팀 |
AWS ECS/EKS를 사용한다면 ECR이 IAM 통합과 네트워크 비용 면에서 유리하다. Docker Hub는 퍼블릭 이미지 배포나 빠른 프로토타이핑에 적합하다.
# 공개 이미지 pull (로그인 불필요)
docker pull nginx:1.25
# Private 이미지 pull (로그인 필요)
docker pull myuser/myapp:1.0.0
docker pull을 생략해도 docker run 시 이미지가 없으면 자동으로 Hub에서 내려받는다.