깃허브 컨테이너 레지스트리 베타 오픈 및 사용법

깃허브 컨테이너 레지스트리 오픈 베타

지난 2019년 5월 깃허브GitHub에서는 프로그래밍 언어 별 패키지 저장소와 도커 이미지 저장소를 제공하는 깃허브 패키지 레지스트GitHub Package Registry를 공개했습니다.

그리고 2020년 9월 1일 깃허브에서는 도커 이미지 관리 기능을 강화한 깃허브 컨테이너 레지스트리GitHub Container Registry 공개 베타를 시작한다고 밝혔습니다.

컨테이너 레지스트리는 기본적으로 깃헙과 마찬가지로 이미지를 퍼블릭하게 공개하는 경우 무료로 사용할 수 있습니다. 현재는 공개 베타를 진행하며 프라이빗 이미지도 무료로 저장할 수 있습니다.

패키지 레지스트리와 컨테이너 레지스트리의 차이

이번 컨테이너 레지스트리가 공개되기 이전에도 패키지 레지스트리에서 이미 도커 이미지를 지원하고 있었습니다. 크게 보면 깃허브 컨테이너 레지스트리는 깃허브 패키지 레지스트리에 속한 서비스입니다만, 조금 차이가 있습니다. 먼저 도커 이미지를 업로드하는 호스트가 다릅니다. 패키지 레지스트리에 이미지를 푸시하는 경우 docker.pkg.github.com을 사용는데, 이와 달리 컨테이너 레지스트리의 호스트는 ghcr.io입니다.

가장 큰 차이점은 패키지 레지스트리가 깃허브 저장소의 하위 기능인 반면 컨테이너 레지스트리는 개인 계정이나 조직(Organization)에 속해있습니다. 따라서 저장소와 무관하게 이미지를 업로드 하는 것이 가능합니다. 패키지 레지스트리가 저장소에 종속된 패키지 배포 기능을 제공한다면, 컨테이너 레지스트리는 도커 허브Docker Hub를 대체하는 서비스라고 할 수 있습니다.

예를 들어 패키지 레지스트리에 도커 이미지를 업로드하는 경우를 생각해보겠습니다. 깃허브 패키지 레지스트리의 도커 이미지 구조는 다음과 같습니다.

docker.pkg.github.com/<GITHUB_ID>/<REPOSITORY_NAME>/<IMAGE_NAME>:<TAG>

여기서 IMAGE_NAME은 자유롭게 정할 수 있습니다. <REPOSITORY_NAME>에 지정하는 저장소는 계정 아래에 미리 만들어져있어야만 합니다. 예를 들어 존재하지 않는 저장소에 푸시를 하면 다음과 같은 에러가 발생합니다.

...
a4399aeb9a0e: Preparing
35a91a75d24b: Preparing
ad44aa179b33: Preparing
2ce3c188c38d: Preparing
name unknown: The expected resource was not found.

반면에 ghcr.io에 푸시를 할 때는 이러한 제약이 없습니다. ghcr.io의 이미지 구조는 다음과 같습니다.

ghcr.io/<GITHUB_ID>/<IMAGE_NAME>:<TAG>

저장소 이름을 지정하지 않아도 됩니다. 실제로 푸시를 해보면 저장소가 없어도 정상적으로 푸시가 되는 것을 확인할 수 있습니다.

...
a4399aeb9a0e: Layer already exists
35a91a75d24b: Layer already exists
ad44aa179b33: Layer already exists
2ce3c188c38d: Layer already exists
20.04: digest: sha256:6f2fb2f9fb5582f8b587837afd6ea8f37d8d1d9e41168c90f410a6ef15fa8ce5 size: 1152

깃허브 컨테이너 레지스트리(GitHub Container Registry) 시작하기

컨테이너 레지스트리의 메뉴는 계정의 패키지 탭에 있습니다. 이 메뉴에서 패키지 레지스트리로 저장소에 등록된 패키지와 컨테이너 레지스트리로 등록한 모든 패키지와 이미지 목록을 확인할 수 있습니다. 도커 안내를 보면 설명이 패키지 레지스트리(docker.pkg.github.com)를 기준으로 나옵니다. 아직 서비스 내에서도 패키지 레지스트리와 컨테이너 레지스트리가 명확히 구분되어있지 않은 느낌입니다.

GitHub 프로필 페이지에서 Package 탭에서 도커 이미지를 확인할 수 있습니다

컨테이너 레지스트리를 사용하려면 먼저 깃허브 액세스 토큰GitHub Access Token이 필요합니다. 액세스 토큰은 깃허브 사이트의 오른쪽 위에 있는 본인 프로필을 클릭하고 Settings -> Developer settings -> Personal access tokens 메뉴에서 생성할 수 있습니다. Generate New Token 버튼을 클릭합니다. 다음 세 가지 권한을 선택하고 토큰을 생성합니다.

생성된 토큰을 안전하게 저장해둡니다. 이 토큰은 깃허브 권한을 가지고 있기 때문에 관리에 주의가 필요합니다.

여기서는 토큰이 현재 디렉터리의 github_token.txt에 저장되어있다고 가정하겠습니다. 다음 명령어로 ghcr.io 도커 레지스트리에 로그인합니다.

$ cat github_token.txt | docker login ghcr.io -u USERNAME --password-stdin
...
Login Succeeded

로그인을 했으면 이미지를 하나 푸시해보겠습니다. 편의상 도커 허브의 공식 ubuntu:20.04 이미지를 이름만 바꿔서 푸시해보겠습니다.

$ docker pull ubuntu:20.04
$ docker tag ubuntu:20.04 ghcr.io/nacyot/ubuntu:20.04
$ docker push ghcr.io/nacyot/ubuntu:20.04
The push refers to repository [ghcr.io/nacyot/ubuntu]
a4399aeb9a0e: Layer already exists
35a91a75d24b: Layer already exists
ad44aa179b33: Layer already exists
2ce3c188c38d: Layer already exists
20.04: digest: sha256:6f2fb2f9fb5582f8b587837afd6ea8f37d8d1d9e41168c90f410a6ef15fa8ce5 size: 1152

정상적으로 푸시가 된 것을 확인할 수 있습니다. 이제 패키지 메뉴에서도 푸시된 이미지를 확인할 수 있습니다.

패키지 목록에서 푸시한 도커 이미지를 확인할 수 있습니다

이미지 상세 페이지에서는 이미지를 사용하는 방법을 확인할 수 있으며, 이미지의 세부 설정을 수정할 수 있습니다.

컨테이너 이미지 상세 페이지

오른쪽에 있는 메뉴에서 Edit Package를 선택하면, 접근 권한을 수정하거나 공개 이미지로 변환하거나 이미지 저장소를 삭제할 수 있습니다.

컨테이니 이미지 설정 페이지이

왼쪽의 Manage versions 메뉴에서는 푸시된 태그별 이미지 목록을 확인할 수 있으며, 특정 태그를 가진 이미지를 삭제하는 것도 가능합니다.

컨테이너 레지스트리의 자세한 사용법에 대해서는 다음 문서를 참고해주세요.

마치며

도커 허브에서 이미지 보존 정책을 변경한다 발표가 바로 직전에 있었는데, 깃허브에서 새로운 컨테이니 이미지 저장소를 발표한만큼 새로운 대안으로 떠오를 가능성이 커보입니다. 단, 깃허브 패키지 레지스트리의 프라이빗 저장소 요금의 경우 기본 사용량이 크지 않은 편입니다. 기본 사용량을 넘어서는 경우 추가요금이 발생 합니다. 아직 컨테이너 레지스트리의 요금 정책이 따로 공개되지는 않았지만, 정식 오픈해서 사용하려면 서비스의 안정성과 요금 등을 고려해봐야할 것으로 보입니다.

깃허브 패키지 레지스트리의 플랜 별 스토리지/데이터 전송량 정보