Engineering
NHN Container Registry(NCR) 이미지 캐시 기능 소개
2022년 12월 22일
원문에서 보기 ↗NHN Container Registry(NCR) 이미지 캐시 기능 소개

컨테이너 레지스트리를 사용하다 보면 다른 레지스트리(Docker Hub, Quay, NCR 등)에서 이미지 다운로드가 필요한 경우가 있습니다. 사용자가 매번 각 레지스트리에 이미지가 변경되었는지 확인하고 다운로드하는 것은 불편한 작업입니다. NHN Container Registry(NCR)에서는 이러한 불편함을 해소하기 위해 이미지 캐시 기능이 추가되었습니다. NCR에 다른 레지스트리의 정보를 등록하면 NCR에서 다른 레지스트리에서 이미지를 다운로드하여 사용자에게 제공합니다.
또한, 이미지 캐시 기능을 통해 레지스트리 서버에 의해 이미지 다운로드 제한(Docker Hub’s rate limit policy)되는 것에 대해 일부 대응이 가능합니다. NCR에서 다른 레지스트리의 이미지를 캐싱하고 제공하여 레지스트리로 요청하는 이미지 다운로드 횟수를 줄일 수 있습니다.
이미지 캐시 기능의 특징
이미지 캐시 기능의 특징은 다음과 같습니다.
- 캐싱된 이미지가 없는 경우 소스 레지스트리의 이미지를 다운로드하여 제공합니다.
- 소스 레지스트리의 이미지가 변경된 경우 소스 레지스트리의 이미지를 다운로드하여 제공합니다.
- 캐싱된 이미지와 소스 레지스트리가 동일한 경우 캐싱된 이미지 제공합니다.
- 소스 레지스트리가 연결되지 않는 경우 캐싱된 이미지를 제공합니다.
- 소스 레지스트리에서 이미지가 삭제된 경우 이미지를 제공하지 않습니다.
- 이미지 캐시를 생성하면
Pull한 날짜가 7일 이내인 아티팩트는 제외하고 정리이미지 정리 정책이 추가됩니다. - 이미지 캐시용 레지스트리에는 이미지를 업로드할 수 없습니다.
일반 레지스트리와 이미지 캐시 레지스트리의 차이점
일반 레지스트리와 이미지 캐시 레지스트리의 차이점은 아래와 같습니다.
| 일반 레지스트리 | 이미지 캐시 레지스트리 | |
|---|---|---|
| 레지스트리에 저장된 이미지 다운로드 | O | O |
| 다른 레지스트리에 저장된 이미지 다운로드 | X | O |
| 이미지 업로드 | O | X |

본 문서에서는 이미지 캐시 레지스트리를 이용하여 Docker Hub에서 hello-world 이미지를 다운로드하는 내용으로 작성하였습니다.
이미지 캐시 설정
이미지 캐시 기능을 사용하려면 NCR 콘솔에서 이미지 캐시를 설정해야 합니다. NCR 콘솔에서 이미지 캐시 탭으로 이동하면 현재 설정된 이미지 캐시 목록을 확인할 수 있습니다.
새로운 이미지 캐시를 설정하기 위해서 + 이미지 캐시 생성 을 클릭합니다. 이미지 캐시 생성 페이지에서 소스 레지스트리의 정보를 입력해야 합니다. 
NCR에서 지원되는 소스 레지스트리 유형과 입력되는 정보는 아래와 같습니다.
| 소스 레지스트리 유형 | URL | Access ID | Access Secret |
|---|---|---|---|
| NHN Container Registry(NCR) | https://xxxxxxxx-$REGION-registry.container.nhncloud.com | User Access Key ID | Secret Access Key |
| Amazon Elastic Container Registry | https://$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazoneaws.com | IAM 액세스키 ID | IAM 비밀 액세스 키 |
| Azure Container Registry | https://$REGISTRY_NAME.azurecr.io | 액세스 키 사용자 이름 | 액세스 키 암호 |
| Google Cloud Container Registry | https://$REGION | _json_key | 서비스 계정의 비공개 키(JSON 유형) |
| Docker Hub | https://hub.docker.com | Username | Password |
| Docker Registry | docker-registry 주소 | Username | Password |
| Harbor | Harbor 주소 | Username | Password |
| Quay | https://quay.io | json_file | { "account_name": "$사용자 계정", "docker_cli_password": "$Quay에서 생성한 암호화된 Password" } |
필요한 정보를 모두 입력한 뒤 확인을 클릭하면 URL, Access ID, Secret 정보를 이용하여 소스 레지스트리와 연동 확인을 하게 됩니다. 연동에 문제가 없는 경우 이미지 캐시가 생성됩니다.
[참고] 소스 레지스트리가 자체 인증서를 사용하거나 신뢰할 수 없는 인증서를 사용하는 경우 인증서 검증을 사용 안 함으로 설정해야 합니다.

이미지 캐시용 레지스트리 생성
이미지 캐시를 생성하였으면 이미지 캐시용 레지스트리를 생성해야 합니다. NCR 콘솔에서 관리 탭으로 이동하여 + 레지스트리 생성 을 클릭합니다. 레지스트리 생성 페이지에서 이미지 캐시를 선택하면 생성한 이미지 캐시 목록이 조회됩니다.
이미지 캐시 대상을 선택한 뒤 확인 을 클릭하면 이미지 캐시용 레지스트리가 생성됩니다. 
이미지 캐시용 레지스트리에서 이미지 다운로드
이미지 캐시용 레지스트리가 생성되면 NCR에 이미지가 없더라도 이미지를 다운로드할 수 있습니다. 로컬 PC에서 터미널을 실행하고 다음과 같이 명령어를 입력하여 이미지를 다운로드할 수 있습니다. NCR 레지스트리에서 이미지 다운로드를 하기 위해서는 사전 준비와 로그인 과정이 필요합니다. 자세한 내용은 NCR 사용 가이드를 참고하세요.
$ docker pull $REGISTRY_DOMAIN/library/hello-world:latest
이미지를 다운로드하면 NCR에도 이미지가 자동으로 추가됩니다. 
이후 동일한 명령어를 이용하여 이미지 다운로드를 수행하면 NCR에 캐싱된 이미지를 제공합니다. 캐싱된 이미지가 제공되고 있는 것은 아래와 같이 확인할 수 있습니다. 이미지 캐시 레지스트리로 Image Pull을 수행하기 전에 Docker Hub에서 Image Pull 가능한 횟수를 확인합니다.
$ TOKEN=$(curl --user '$USERNAME:$PASSWORD' "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest 2>&1 | grep ratelimit-remaining
ratelimit-remaining: 199;w=21600
로컬 PC에 다운로드되어 있는 이미지는 삭제합니다.
$ docker rmi $REGISTRY_DOMAIN/library/hello-world:latest
이미지 캐시 레지스트리로 Image Pull을 수행 후 Docker Hub에서 Image Pull 가능한 횟수를 조회하면 Image Pull 가능한 횟수가 차감되지 않는 것을 확인할 수 있습니다.
$ docker pull $REGISTRY_DOMAIN/library/hello-world:latest
$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest 2>&1 | grep ratelimit-remaining
ratelimit-remaining: 199;w=21600
NCR 콘솔에서는 Pull 횟수가 증가하는 것을 확인할 수 있습니다. 
마치며
NCR의 이미지 캐시 기능에 대해서 알아보았습니다. 정리하면 아래와 같습니다.
- NCR 콘솔에서 이미지 캐시를 생성할 수 있습니다.
- 이미지 캐시 레지스트리를 통해 다른 레지스트리의 이미지를 제공받을 수 있습니다.
- 이미지 캐시 레지스트리에 캐싱된 이미지가 있으면 캐싱된 이미지를 제공합니다.
- 퍼블릭 이미지 캐시 기능은 아직 지원되지 않지만
Docker Hub’s rate limit policy에 대응할 수 있습니다.
이미지 캐시에 대한 자세한 내용은 이미지 캐시 사용을 참고해 주세요.