Container Registry에서 이미지 복사

Container Registry에서 Artifact Registry로 전환하는 과정에서 Artifact Registry에서 유지할 Container Registry 이미지를 복사할 수 있습니다.

개요

Container Registry에서 Artifact Registry로 이미지를 복사하는 몇 가지 옵션이 있습니다. 권장하는 옵션은 자동 마이그레이션 도구를 사용하여 이미지를 복사하는 것입니다. 이 도구는 여러 프로젝트 복사를 지원하고, 이미 리디렉션을 사용 설정한 경우에도 이미지를 복사할 수 있으며, 다른 방법보다 더 많은 수의 이미지를 처리할 수 있기 때문입니다.

비용을 줄이려면 다음을 수행합니다.

  1. 컨테이너를 Artifact Registry로 복사하기 전에 태그를 지정하지 않은 이전 이미지를 삭제하세요.

  2. 이미지를 표준(pkg.dev) Artifact Registry 저장소에 복사하는 경우 비용이 중복 발생하는 것을 방지하기 위해 이미지를 복사하기 전에 Artifact Registry에 대해 자동 스캔을 사용 중지하세요. 모든 이미지를 복사한 후 자동 스캔을 다시 사용 설정할 수 있습니다.

    Artifact Registry의 gcr.io 저장소에 이미지를 복사하는 경우 자동 스캔을 사용 중지할 필요가 없습니다.

    취약점 스캔과 관련된 비용 관리에 대한 자세한 내용은 취약점 스캔 비용 관리를 참조하세요.

Container Registry에서 태그가 지정되지 않은 이미지 삭제

태그가 지정되지 않은 이미지를 삭제하면 Container Registry의 스토리지 비용과 Container Registry에서 Artifact Registry로 이미지를 복사하는 비용이 줄어듭니다.

여러 도구를 사용해 더 이상 필요하지 않은 이미지를 식별하고 해당 이미지의 삭제를 자동화할 수 있습니다. 예를 들어 gcr-cleaner 도구를 사용하면 다양한 기준에 따라 이전 이미지를 찾고 삭제할 수 있습니다. gcr-cleaner 도구는 공식 Google 제품이 아닙니다.

도구 설정 및 사용에 대한 자세한 내용은 gcr-cleaner 문서를 참조하세요.

자동 마이그레이션 도구를 사용하여 이미지 복사(권장)

자동 마이그레이션 도구를 사용하여 Container Registry에서 Artifact Registry의 gcr.io 저장소 또는 표준 Artifact Registry 저장소로 전환하거나 Container Registry에서 Artifact Registry로 이미지를 복사합니다.

이 도구는 동일한 멀티 리전으로의 마이그레이션 및 복사만 지원합니다.

Artifact Registry로 자동 마이그레이션의 안내에 따라 Container Registry에서 Artifact Registry로 이미지를 복사하세요.

gcrane으로 이미지 복사

Artifact Registry에 이미지를 복사할 때 gcrane 도구를 사용할 수도 있습니다.

gcrane을 사용하면 여러 리전 간에 이미지를 복사할 수 있지만 다음과 같은 단점이 있습니다.

  • gcrane은 자동화된 도구보다 느립니다.
  • gcrane은 Container Registry 할당량에 따라 제한됩니다.
  • 이미지에 10,000개 이상의 버전 또는 태그가 있으면 gcrane이 실패할 수 있습니다.
  • 이미지가 잘못 구성되었거나 데이터가 누락된 경우 gcrane이 실패할 수 있습니다.

요구사항

다음 요구사항을 확인하세요.

  1. 소스 및 대상 Google Cloud 프로젝트에서 Artifact Registry를 사용 설정했습니다.

  2. Artifact Registry에서 복사하는 이미지를 위해 Docker 저장소를 만들었습니다.

  3. 다음과 같은 필수 권한이 있습니다.

  4. 빠른 복사 옵션을 사용하려면 다음 요구사항을 확인하세요.

    • gcrane 버전 0.10.0 이상을 사용해야 합니다. 이 문서의 gcrane 설정 안내에는 최신 버전을 다운로드하는 단계가 포함되어 있습니다.

      기존 gcrane 설치 버전을 확인하려면 다음 명령어를 실행합니다.

      gcrane version
      
    • 대상 프로젝트의 Artifact Registry 서비스 에이전트에는 스토리지 객체 뷰어(roles/storage.objectViewer) 역할이나 소스 프로젝트에서 동일한 권한을 가진 역할이 있어야 합니다. 다음 명령어를 실행하여 서비스 에이전트에 스토리지 객체 뷰어 역할을 부여합니다.

      gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID \
          --member='serviceAccount:service-DEST_PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com' \
          --role='roles/storage.objectViewer'
      

      SOURCE_PROJECT_ID를 Container Registry 호스트의 Google Cloud 프로젝트의 ID(예: 'my-project')로 바꿉니다.

      DEST_PROJECT_NUMBER를 Artifact Registry 저장소의 Google Cloud 프로젝트 번호(예: 12345)로 바꿉니다.

환경 옵션 및 비용

여러 환경에서 gcrane을 실행할 수 있습니다.

  • Compute Engine 인스턴스 - 복사할 컨테이너 수가 많은 경우 이 옵션을 사용합니다.

    비용:

    • Compute Engine VM의 인스턴스 업타임
    • 복사하는 이미지에 대한 네트워크 데이터 전송(빠른 복사 옵션을 사용하지 않는 한) 비용을 최소화하려면 다음 안내를 따르세요.
    • Container Registry 스토리지 버킷과 동일한 위치에 있는 VM 인스턴스를 사용합니다.
    • 비용을 최소화하고 복사 속도를 극대화하려면 Container Registry와 동일한 멀티 리전에 있는 Artifact Registry 저장소를 사용합니다. 동일한 멀티 리전 내 데이터 전송에는 요금이 부과되지 않으며 위치 간 복사보다 훨씬 빠릅니다.
  • Cloud Shell - 약 40GB 이하의 소규모 집합을 복사하는 옵션입니다. gcrane은 이미 업로드된 이미지 레이어의 업로드를 건너뛰므로, 이 한도는 복사 중인 새 데이터에 적용됩니다.

    큰 저장소를 복사하면 요청 제한 시간 10분이 지나고 Cloud Shell 연결이 끊어질 수 있습니다.

    비용: 복사하는 이미지에 대한 네트워크 데이터 전송(빠른 복사 옵션을 사용하지 않는 한)

    • Cloud Shell 세션의 위치를 선택할 수 없습니다. 현재 세션의 위치를 확인하려면 다음 명령어를 실행합니다.
    curl metadata/computeMetadata/v1/instance/zone
    
    • 비용을 최소화하고 복사 속도를 극대화하려면 Container Registry와 동일한 멀티 리전에 있는 Artifact Registry 저장소를 사용합니다. 동일한 멀티 리전 내 데이터 전송에는 요금이 부과되지 않으며 위치 간 복사보다 훨씬 빠릅니다.
  • 로컬 머신 - 다른 옵션을 사용할 수 없는 경우 로컬 머신에서 gcrane을 실행할 수 있습니다.

    비용: 복사하는 이미지에 대한 네트워크 데이터 전송(빠른 복사 옵션을 사용하지 않는 한)

    비용을 최소화하고 복사 속도를 극대화하려면 Container Registry와 동일한 멀티 리전에 있는 Artifact Registry 저장소를 사용합니다. 동일한 멀티 리전 내 데이터 전송에는 요금이 부과되지 않으며 위치 간 복사보다 훨씬 빠릅니다.

Compute Engine 설정

gcrane을 사용하여 Compute Engine VM 인스턴스의 이미지를 복사하려면 다음 안내를 따르세요.

  1. VM 인스턴스를 만듭니다. 비용을 최소화하려면 복사하는 원본 레지스트리와 동일한 위치에 인스턴스를 만듭니다.
  2. 기본적으로 VM 인스턴스는 기본 서비스 계정과 연결되며 이미지를 가져올 권한이 있습니다. VM 인스턴스가 이미지를 푸시할 수 있도록 액세스 범위를 변경해야 합니다.

    1. VM 인스턴스를 중지합니다. 인스턴스 중지를 참조하세요.

    2. 다음 명령어를 사용하여 액세스 범위를 변경합니다.

      gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
      

      INSTANCE을 VM 인스턴스의 이름으로 바꿉니다.

    3. VM 인스턴스를 다시 시작합니다. 중지된 인스턴스 시작을 참조하세요.

  3. SSH를 사용하여 VM 인스턴스에 연결합니다.

  4. 다음 명령어를 실행하여 gcrane을 다운로드합니다.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  5. 다음 명령어를 실행하여 gcrane 명령어를 실행 가능하게 만듭니다.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  6. gcrane --help 명령어를 실행하여 설치를 확인합니다.

이제 이미지를 복사할 수 있습니다. 계속하려면 다음 안내를 따르세요.

Cloud Shell 설정

  1. Cloud Shell 창을 엽니다.

    Cloud Shell 열기

  2. 기본 프로젝트를 설정합니다. PROJECT를 Container Registry와 Artifact Registry가 설치된 프로젝트의 ID로 바꿉니다.

    gcloud config set project PROJECT
    
  3. 다음 명령어를 실행하여 gcrane 도구를 다운로드합니다.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  4. 다음 명령어를 실행하여 gcrane 명령어를 실행 가능하게 만듭니다.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  5. gcrane --help 명령어를 실행하여 설치를 확인합니다.

이제 이미지를 복사할 수 있습니다. 계속하려면 다음 안내를 따르세요.

로컬 머신 설정

  1. GitHub 저장소에서 gcrane을 다운로드합니다. 예를 들어 다음 명령어는 명령줄에서 Linux x86-64 배포판을 다운로드합니다.

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  2. 다음 명령어를 실행하여 gcrane 명령어를 실행 가능하게 만듭니다. 이 명령어는 다운로드한 파일의 이름이 go-containerregistry.tar.gz라고 가정합니다.

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  3. gcrane --help 명령어를 실행하여 설치를 확인합니다.

이제 이미지를 복사할 수 있습니다. 계속하려면 다음 안내를 따르세요.

복사할 이미지 식별

gcrane을 설치하면 Container Registry의 기존 이미지를 나열하여 복사할 이미지를 찾을 수 있습니다.

기존 이미지를 나열하려면 다음 명령어를 실행합니다.

gcrane ls LOCATION.gcr.io/PROJECT

이미지에 있는 태그를 나열하려면 다음 명령어를 실행합니다.

gcrane ls LOCATION.gcr.io/PROJECT/IMAGE

특정 경로에 있는 이미지를 재귀적으로 나열하려면 다음 명령어를 실행합니다.

gcrane ls -r LOCATION.gcr.io/PROJECT/PATH

각 명령어마다 다음을 수행합니다.

  • LOCATION을 레지스트리의 멀티 리전(asia, eu, us)으로 바꿉니다.
  • PROJECT를 프로젝트 ID로 바꿉니다.

이미지 복사 명령어는 이미지 복사를 참조하세요.

이미지 복사

Container Registry의 개별 이미지, 특정 위치의 지정된 경로 아래에 있는 모든 이미지 또는 한 위치에 저장된 모든 이미지를 복사할 수 있습니다.

단일 이미지 복사

태그가 지정된 단일 이미지를 복사하려면 다음 명령어를 실행하세요.

gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE

각 항목의 의미는 다음과 같습니다.

  • GCR-LOCATION은 Container Registry 호스트의 멀티 리전(asia, eu, us)입니다.
  • AR-LOCATION은 저장소의 리전 또는 멀티 리전입니다.
  • PROJECT는 프로젝트 ID입니다.
  • REPOSITORY는 Artifact Registry 저장소의 이름입니다.
  • GCR-IMAGE는 Container Registry에서 복사할 이미지입니다.
  • AR-IMAGE는 Artifact Registry에 있는 이미지의 이름입니다.

예를 들어 다음과 같은 소스 및 대상 이미지를 가정해 보겠습니다.

  • Container Registry 이미지: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 이미지: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

다음 명령어를 실행하여 이미지를 복사합니다.

gcrane cp eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

경로 아래의 모든 이미지 복사

Container Registry의 특정 경로 아래에 있는 이미지를 재귀적으로 복사하려면 다음 명령어를 실행합니다.

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT/GCR-PATH \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/AR-PATH

각 항목의 의미는 다음과 같습니다.

  • GCR-LOCATION은 Container Registry 호스트의 멀티 리전(asia, eu, us)입니다.
  • AR-LOCATION은 저장소의 리전 또는 멀티 리전입니다.
  • PROJECT는 프로젝트 ID입니다.
  • REPOSITORY는 Artifact Registry 저장소의 이름입니다.
  • GCR-PATH는 복사할 파일의 경로입니다.
  • AR-PATH는 Artifact Registry 저장소의 이미지 경로입니다.

예를 들어 다음과 같은 소스 및 대상 경로를 가정해 보겠습니다.

  • Container Registry 경로: eu.gcr.io/my-project/test-images/testing
  • Artifact Registry 경로: europe-docker.pkg.dev/my-project/my-repo/test-images/testing

다음 명령어는 test-images/testing 아래의 모든 이미지를 my-repo 저장소에 재귀적으로 복사합니다.

gcrane cp -r eu.gcr.io/my-project/test-images/testing \
europe-docker.pkg.dev/my-project/my-repo/test-images/testing

Container Registry 위치에서 모든 이미지 복사

Container Registry 멀티 리전의 모든 이미지를 복사하려면 다음 명령어를 실행합니다.

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY

각 항목의 의미는 다음과 같습니다.

  • GCR-LOCATION은 Container Registry 호스트의 멀티 리전(asia, eu, us)입니다.
  • AR-LOCATION은 저장소의 리전 또는 멀티 리전입니다.
  • PROJECT는 프로젝트 ID입니다.
  • REPOSITORY는 Artifact Registry 저장소의 이름입니다.

프로젝트에서 두 개 이상의 Container Registry 위치에 대한 이미지를 복사하려면 각 호스트마다 명령어를 한 번 실행합니다.

예를 들어 다음과 같은 소스 레지스트리와 대상 Artifact Registry 저장소를 가정해 보겠습니다. 이 예시에서 Container Registry와 Artifact Registry는 서로 다른 프로젝트에 있습니다.

  • Container Registry 호스트: eu.gcr.io/my-project
  • Artifact Registry 이미지: europe-docker.pkg.dev/new-project/my-repo

다음 명령어는 my-project 프로젝트의 eu 멀티 리전에서 new-project 프로젝트의 my-repo 저장소에 모든 이미지를 복사합니다.

gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo

Docker로 이미지 복사

gcranegcloud 복사 방법과 달리 이 접근 방식은 2단계 프로세스입니다.

  1. Container Registry에서 이미지 가져오기
  2. Artifact Registry 저장소로 이미지 내보내기

요구사항

다음 요구사항을 확인하세요.

  1. Artifact Registry에서 복사하는 이미지를 위해 Docker 저장소를 만들었습니다.

  2. 다음과 같은 필수 권한이 있습니다.

  3. Container RegistryArtifact Registry에 모두 인증하도록 Docker를 구성했습니다.

비용

이미지를 가져오면 네트워크 데이터 전송 요금이 청구됩니다. 구체적인 가격은 pull 명령어의 대상에 따라 달라집니다. 예를 들어 Cloud Shell 세션에서 이미지를 가져올 경우 Google Cloud 내의 네트워크 데이터 전송에 대한 가격이 적용됩니다. Google Cloud 외부의 머신으로 이미지를 가져오는 경우 일반 네트워크 데이터 전송에 대한 가격이 적용됩니다.

Artifact Registry에서 이미지를 태그 지정하고 내보내고 가져오는 데 사용하는 Docker 명령어는 Container Registry에서 사용하는 명령어와 유사합니다. 하지만 다음과 같은 두 가지 주된 차이점이 있습니다.

  • Artifact Registry Docker 저장소의 호스트 이름에는 위치 프리픽스와 이어서 -docker.pkg.dev가 붙습니다. 예를 들어 australia-southeast1-docker.pkg.dev, europe-north1-docker.pkg.dev, europe-docker.pkg.dev가 있습니다.
  • Artifact Registry는 단일 프로젝트에서 여러 Docker 저장소를 지원하므로 명령어에 저장소 이름을 지정해야 합니다.

Docker를 사용하여 이미지를 Artifact Registry에 복사하려면 Container Registry에서 이미지를 가져온 후 Artifact Registry 저장소로 내보냅니다.

예를 들어 eu 멀티 리전의 Container Registry 이미지를 사용하여 europe 리전의 Artifact Registry 저장소에 복사하려는 경우를 가정해 보겠습니다.

  • Container Registry 이미지: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 이미지: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

다음 명령어는 Container Registry에서 이미지를 가져옵니다.

docker pull eu.gcr.io/my-project/my-image:tag1

다음 명령어는 이미지를 my-repo라는 Artifact Registry 저장소에 내보냅니다.

docker push europe-north1-docker.pkg.dev/my-project/my-repo/my-image

다른 프로젝트에서 설정한 Artifact Registry 저장소로 이미지를 내보낼 수도 있습니다. 이 예시에서는 동일한 소스 이미지를 new-project 프로젝트의 my-repo 저장소에 내보냅니다.

docker push europe-north1-docker.pkg.dev/new-project/my-repo/my-image

Artifact Registry에서 이미지를 내보내고 가져오는 방법에 대한 자세한 내용은 이미지 가져오기 및 내보내기를 참조하세요.

gcloud로 이미지 복사

gcloud container images add-tag 명령어를 사용하여 Container Registry의 이미지를 Artifact Registry 저장소에 복사합니다.

요구사항

다음 요구사항을 확인하세요.

  1. Artifact Registry에서 복사하는 이미지를 위해 Docker 저장소를 만들었습니다.

  2. 다음과 같은 필수 권한이 있습니다.

비용

Container Registry가 Artifact Registry 저장소와 다른 위치에 있는 경우 복사하는 이미지에 네트워크 데이터 전송 요금이 적용됩니다. 두 서비스가 같은 위치에 있으면 네트워크 데이터 전송은 무료입니다.

다음 명령어를 실행하여 이미지를 Container Registry에서 Artifact Registry로 복사합니다.

gcloud container images add-tag GCR-IMAGE AR-IMAGE

각 항목의 의미는 다음과 같습니다.

  • GCR-IMAGE는 Container Registry 이미지의 전체 경로입니다.
  • AR-IMAGE는 Artifact Registry 저장소에 있는 이미지의 전체 경로입니다.

예를 들어 다음과 같은 소스 및 대상 이미지를 가정해 보겠습니다.

  • Container Registry 이미지: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 이미지: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

이 명령어는 멀티 리전 eu의 Container Registry에서 멀티 리전 europe의 저장소 my-repo로 이미지를 복사합니다.

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

다른 프로젝트에서 설정한 Artifact Registry 저장소로 이미지를 복사할 수도 있습니다. 이 예시에서는 동일한 소스 이미지를 new-project 프로젝트의 my-repo 저장소에 복사합니다.

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/new-project/my-repo/my-image:tag1

다음 단계