팀 내에서 Docker 이미지를 공유할 때 Docker Hub에 올리면 소스코드가 외부에 노출될 위험이 있다. 프라이빗 레지스트리를 사용하면 이미지 접근을 팀 내부로 제한하면서 CI/CD 파이프라인과 자연스럽게 연결할 수 있다. AWS ECR이나 Self-hosted Registry 중 환경에 맞는 방식을 선택하면 된다.
| 항목 | Docker Hub | 프라이빗 레지스트리 |
|---|---|---|
| 공개 여부 | Public 기본 | 완전 비공개 |
| 비용 | 무료(제한) / 유료 | 인프라 비용 |
| 접근 제어 | 계정 기반 | IAM / 토큰 |
| 속도 | 외부 네트워크 | VPC 내부 |
| 관리 주체 | Docker Inc. | 팀 직접 관리 |
프라이빗 레지스트리는 이미지 저장소를 직접 운영하거나 클라우드 서비스로 위임하는 방식이다.
Registry: Docker 이미지를 저장하고 버전별로 관리하는 서버. Docker Hub가 가장 대표적인 퍼블릭 레지스트리다.
[개발자 로컬]
│ docker build
▼
[로컬 이미지]
│ docker tag / docker push
▼
[프라이빗 레지스트리] ◀──── 접근 제어 (IAM / 토큰)
│ docker pull
▼
[프로덕션 서버 / K8s Pod]
AWS ECR은 IAM 권한으로 접근을 제어하는 관리형 레지스트리다. 별도 서버 없이 AWS 계정 내에서 바로 사용할 수 있다.
1. 레포지토리 생성
aws ecr create-repository \
--repository-name my-app \
--region ap-northeast-2
2. 로그인
aws ecr get-login-password --region ap-northeast-2 \
| docker login --username AWS \
--password-stdin 123456789.dkr.ecr.ap-northeast-2.amazonaws.com
3. 이미지 태그 및 푸시
docker build -t my-app .
docker tag my-app:latest \
123456789.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
docker push \
123456789.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
docker tag: 기존 이미지에 새 이름(레지스트리 주소 포함)을 붙이는 명령. 이미지 복사가 아니라 동일 레이어를 가리키는 별칭을 만든다.
AWS 의존성 없이 직접 운영하려면 Docker 공식 registry 이미지로 5분 안에 구성할 수 있다.
docker run -d \
-p 5000:5000 \
--name local-registry \
-v /data/registry:/var/lib/registry \
registry:2
이미지 push는 동일한 패턴이다.
docker tag my-app:latest localhost:5000/my-app:latest
docker push localhost:5000/my-app:latest
운영 환경에서는 TLS 인증서와 HTTP Basic Auth 또는 토큰 기반 인증을 반드시 설정해야 한다.
Self-hosted Registry: 팀이 직접 서버를 운영하는 레지스트리. 네트워크 지연이 낮고 데이터 주권을 유지할 수 있지만 운영 비용이 발생한다.
AWS ECR은 IAM Policy로 Push/Pull 권한을 분리한다. CI 서버에는 Push 권한, 프로덕션 서버에는 Pull 권한만 부여하는 것이 원칙이다.
{
"Effect": "Allow",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "arn:aws:ecr:ap-northeast-2:123456789:repository/my-app"
}
Self-hosted의 경우 htpasswd로 사용자별 자격증명을 관리하거나 OAuth2 Proxy를 앞단에 두는 방식을 사용한다.
다른 서버에서 이미지를 내려받을 때는 동일하게 로그인 후 pull한다.
docker pull \
123456789.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
ECR 토큰은 12시간마다 만료되므로, K8s 환경에서는 ecr-credential-helper나 IRSA를 활용해 자동 갱신을 설정해야 한다.