Docker 레지스트리는 이미지를 저장하고 배포하는 중앙 서버입니다. 공개 레지스트리로는 Docker Hub가 있지만, 무료로는 프라이빗 이미지 개수에 제한이 있고 조직 내부용으로만 쓰고 싶은 경우도 많죠. 그럴 때 직접 프라이빗 레지스트리를 구축합니다.
레지스트리 서버 실행
docker run -d \
-p 5000:5000 \
--name registry \
-v /root/registry/data:/var/lib/registry \
registry:2
-v 로 로컬 디렉토리를 컨테이너 볼륨에 매핑해두면, 컨테이너가 삭제되더라도 이미지 데이터가 로컬에 남습니다. 재기동 시 그 데이터를 그대로 다시 읽어와요.
이미지 올리기
프라이빗 레지스트리에 올릴 이미지는 이름을 아래 형식으로 짓습니다.
[레지스트리 도메인 또는 IP]:[포트]/[이미지명]:[태그]
로컬호스트에 구축한 경우 예시입니다.
docker build -t localhost:5000/test:1 .
docker push localhost:5000/test:1
이미 만든 이미지의 이름만 바꿔야 한다면 태그를 다시 붙입니다.
docker tag localhost:5000/test:1 registry.example.com/test:1
저장된 이미지 확인
레지스트리에 어떤 이미지가 들어있는지는 카탈로그 API로 확인합니다.
curl -X GET [레지스트리 도메인 또는 IP]:5000/v2/_catalog
자주 만나는 오류: HTTP/HTTPS
레지스트리를 쓰다 보면 이 메시지를 만나기 쉽습니다.
http: server gave HTTP response to HTTPS client
Docker 클라이언트는 기본적으로 레지스트리와 HTTPS로 통신하려고 하는데, 서버에 인증서(SSL)가 적용돼 있지 않아 생기는 문제예요.
가장 좋은 해결책은 도메인에 정식 인증서를 적용하는 것입니다. 보안상으로도 그게 맞아요. 다만 내부 테스트 환경 등에서 임시로 넘어가야 한다면, 해당 레지스트리를 “안전하지 않은 레지스트리”로 등록할 수 있습니다.
vim /etc/docker/daemon.json
{
"insecure-registries": ["IP:PORT", "DOMAIN:PORT"]
}
systemctl daemon-reload
systemctl restart docker
insecure-registries 는 말 그대로 암호화 없이 통신을 허용하는 설정이라, 신뢰할 수 있는 내부망에서만 임시로 쓰고 운영 환경에서는 반드시 인증서를 붙이는 걸 권장합니다.