이 페이지에서는 관리형 Harbor 서비스 (MHS) 인증 도우미 또는 CLI 비밀을 사용하여 Docker 또는 Helm에 로그인하는 방법을 설명합니다.
유연성을 제공하기 위해 Google Distributed Cloud (GDC) 에어 갭은 Harbor 레지스트리 인스턴스에서 Docker 및 Helm으로 인증하는 두 가지 방법을 제공합니다. 첫 번째 방법은 관리형 Harbor 서비스 (MHS) 사용자 인증 정보 도우미와 GDC ID를 사용하여 Docker 또는 Helm CLI에 로그인하는 것입니다. GDC로 인증한 후에는 Harbor에서 별도의 CLI 보안 비밀을 만들거나 관리하지 않고도 Docker 클라이언트에 로그인하여 Docker 작업을 실행할 수 있습니다.
두 번째 방법은 CLI 보안 비밀을 사용하는 것입니다. Identity-Aware Proxy (IAP)를 사용하여 인증하고 Harbor 인터페이스에 처음 로그인한 후 Docker 또는 Helm CLI를 사용하여 Harbor에 액세스합니다. Docker 및 Helm CLI는 IAP의 리디렉션을 처리할 수 없으므로 Harbor는 Docker 또는 Helm에서 로그인할 때 사용할 CLI 보안 비밀을 제공합니다. 이 메서드는 Harbor가 IAP 인증을 사용하는 경우에만 사용할 수 있습니다.
시작하기 전에
Harbor 레지스트리 인스턴스에 Docker 및 Helm 인증을 구성하려면 다음이 필요합니다.
환경에 설치된 MHS 사용자 인증 정보 도우미 docker-credential-mhs 사용자 인증 정보 도우미는 gdcloud CLI 번들에 기본적으로 포함되어 있습니다. 자세한 내용은 gdcloud CLI 개요를 참고하세요.
필요한 ID 및 액세스 역할입니다. 조직 IAM 관리자에게 Harbor 인스턴스 뷰어 (harbor-instance-viewer) 역할을 부여해 달라고 요청합니다.
GDC ID로 Docker에 로그인
GDC ID와 함께 MHS 사용자 인증 정보 도우미를 사용하여 Docker CLI에 로그인합니다. Docker로 인증하려면 다음 단계를 따르세요.
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["이해하기 어려움","hardToUnderstand","thumb-down"],["잘못된 정보 또는 샘플 코드","incorrectInformationOrSampleCode","thumb-down"],["필요한 정보/샘플이 없음","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-09-04(UTC)"],[[["\u003cp\u003eThis document outlines two methods for authenticating with Docker and Helm for Harbor registry instances within Google Distributed Cloud (GDC) air-gapped environments.\u003c/p\u003e\n"],["\u003cp\u003eThe first method involves using the Managed Harbor Service (MHS) credential helper along with your GDC identity, enabling direct sign-in to the Docker or Helm CLI without managing separate secrets.\u003c/p\u003e\n"],["\u003cp\u003eThe second method utilizes CLI secrets generated within the Harbor interface, which are necessary because Docker and Helm CLIs do not support Identity-Aware Proxy (IAP) redirection.\u003c/p\u003e\n"],["\u003cp\u003eTo use the MHS credential helper method, you must have the \u003ccode\u003edocker-credential-mhs\u003c/code\u003e installed and the Harbor Instance Viewer role, after which you can sign into docker and perform operations such as pushing and pulling images.\u003c/p\u003e\n"],["\u003cp\u003eCLI secrets, used in the alternative method, can be copied from the user profile section in Harbor and are non-expiring unless manually rotated.\u003c/p\u003e\n"]]],[],null,["# Sign in to Docker and Helm\n\nThis page describes how to sign in to Docker or Helm using the Managed Harbor Service (MHS) credential helper or CLI secrets.\n\nTo provide flexibility, Google Distributed Cloud (GDC) air-gapped provides two methods to authenticate with Docker and Helm from your Harbor registry instance. The first method is using the Managed Harbor Service (MHS) credential helper and your GDC identity to sign in to the Docker or Helm CLI. After authenticating with GDC, you can sign in to the Docker client and perform Docker operations, without having to create or manage separate CLI secrets in Harbor.\n\nThe second method is using CLI secrets. After you authenticate using Identity-Aware Proxy (IAP) and sign in to the Harbor interface for the first time, use the Docker or Helm CLI to access Harbor. The Docker and Helm CLIs cannot handle redirection for IAP, so Harbor provides a CLI secret to use when signing in from Docker or Helm. This method is only available when Harbor uses IAP authentication.\n\nBefore you begin\n----------------\n\nTo configure Docker and Helm authentication for Harbor registry instances, you must have the following:\n\n- The MHS credential helper `docker-credential-mhs` installed in the environment. The credential helper is included by default in the gdcloud CLI bundle. For more information, see [gdcloud CLI overview](/distributed-cloud/hosted/docs/latest/gdch/resources/gdcloud-overview).\n- The necessary identity and access role. Ask your Organization IAM Admin to grant you the Harbor Instance Viewer (`harbor-instance-viewer`) role.\n\nSign in to Docker with your GDC identity\n----------------------------------------\n\nUse the MHS credential helper with your GDC identity to sign into the Docker\nCLI. To authenticate with Docker, follow these steps:\n\n1. Sign in to the Management API server with GDC CLI by following the\n instructions in\n [Sign in](/distributed-cloud/hosted/docs/latest/gdch/platform/pa-user/iam/sign-in).\n\n2. Configure Docker to use the MHS credential helper `docker-credential-mhs`:\n\n TENANT_PROJECT=\u003cvar translate=\"no\"\u003ePROJECT_NAME\u003c/var\u003e\n HARBOR_INSTANCE_NAME=\u003cvar translate=\"no\"\u003eHARBOR_INSTANCE_NAME\u003c/var\u003e\n REGISTRY=$(kubectl get harborinstance $HARBOR_INSTANCE_NAME -n $TENANT_PROJECT -o jsonpath='{.status.url}' | sed s#https://##)\n\n docker-credential-mhs configure-docker --registries=${REGISTRY}\n\n Replace the following:\n - \u003cvar translate=\"no\"\u003ePROJECT_NAME\u003c/var\u003e: the name of your tenant project. This is the same project name you provided when [creating your Harbor instance](/distributed-cloud/hosted/docs/latest/gdch/platform-application/pa-ao-operations/create-harbor-instances#create-a-harbor-registry-instance).\n - \u003cvar translate=\"no\"\u003eHARBOR_INSTANCE_NAME\u003c/var\u003e: the name of the Harbor instance that is created in [Create Harbor registry instances](/distributed-cloud/hosted/docs/latest/gdch/platform-application/pa-ao-operations/create-harbor-instances).\n3. Follow the instructions in\n [Configure Docker to trust the Harbor root CA](/distributed-cloud/hosted/docs/latest/gdch/platform-application/pa-ao-operations/configure-docker-trust#configure-docker-to-trust-harbor-root-ca).\n\n4. Optional: Verify that the credential helper is successfully configured\n by verifying the `mhs` entry is added to `~/.docker/config.json`:\n\n cat \u003cvar translate=\"no\"\u003eDOCKER_CONFIG_PATH\u003c/var\u003e\n\n Replace \u003cvar translate=\"no\"\u003eDOCKER_CONFIG_PATH\u003c/var\u003e with the path to your docker config file. For\n example, `~/.docker/config.json.`\n\n The output is similar to the following: \n\n {\n \"auths\": {\n \"10.200.0.1\": {\n \"auth\": \"YWRtaW46YWRtaW4=\"\n },\n \"10.200.16.5:10443\": {\n \"auth\": \"YWRtaW46ZEROVVJCVWE1a1FBcE4xQQ==\"\n }\n },\n \"credHelpers\": {\n \"asia.gcr.io\": \"gcloud\",\n \"eu.gcr.io\": \"gcloud\",\n \"gcr.io\": \"gcloud\",\n \"marketplace.gcr.io\": \"gcloud\",\n \"myinstance-e2e-test-user.org-1.zone1.google.gdch.test\": \"mhs\",\n \"staging-k8s.gcr.io\": \"gcloud\",\n \"us-central1-docker.pkg.dev\": \"gcloud\",\n \"us.gcr.io\": \"gcloud\"\n }\n }\n\n This example shows a successful output of `\"myinstance-e2e-test-user.org-1.zone1.google.gdch.test\": \"mhs\"`.\n5. Configure the tenant project in `gdcloud`:\n\n TENANT_PROJECT=\u003cvar translate=\"no\"\u003ePROJECT_NAME\u003c/var\u003e\n gdcloud config set project $TENANT_PROJECT\n\n The following output is shown: \n\n Updated property [core/project].\n\n6. Identify a Harbor project that you have management access to.\n [Create a Harbor project](/distributed-cloud/hosted/docs/latest/gdch/platform-application/pa-ao-operations/create-harbor-projects)\n if one does not exist.\n\n7. Perform Docker operations, such as an image push or pull:\n\n TENANT_PROJECT=\u003cvar translate=\"no\"\u003ePROJECT_NAME\u003c/var\u003e\n HARBOR_INSTANCE_NAME=\u003cvar translate=\"no\"\u003eHARBOR_INSTANCE_NAME\u003c/var\u003e\n REGISTRY=$(kubectl get harborinstance $HARBOR_INSTANCE_NAME -n $TENANT_PROJECT -o jsonpath='{.status.url}' | sed s#https://##)\n HARBOR_PROJECT=\u003cvar translate=\"no\"\u003eHARBOR_PROJECT_NAME\u003c/var\u003e\n\n # Push image\n docker pull nginx\n docker tag nginx ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest\n docker push ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest\n\n # Pull image\n docker pull ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest\n\n A successful output is similar to the following: \n\n # Push image\n root@gpc-adhoc-70846130vm-bootstrapper-zone1:~# docker push ${REGISTRY}/harbor-project/nginx:latest\n The push refers to repository [myinstance-e2e-test-user.org-1.zone1.google.gdch.test/harbor-project/nginx]\n e4e9e9ad93c2: Pushed\n 6ac729401225: Pushed\n 8ce189049cb5: Pushed\n 296af1bd2844: Pushed\n 63d7ce983cd5: Pushed\n b33db0c3c3a8: Pushed\n 98b5f35ea9d3: Pushed\n latest: digest: sha256:7ba542bde95e6523a4b126f610553e3657b8108bc3175596ee7e911ae1219bfc size: 1778\n\n # Pull image\n root@gpc-adhoc-70846130vm-bootstrapper-zone1:~# docker pull ${REGISTRY}/harbor-project/nginx:latest\n latest: Pulling from harbor-project/nginx\n Digest: sha256:7ba542bde95e6523a4b126f610553e3657b8108bc3175596ee7e911ae1219bfc\n Status: Image is up to date for myinstance-e2e-test-user.org-1.zone1.google.gdch.test/harbor-project/nginx:latest\n\n If the operation is unsuccessful, you might see the following output: \n\n E1025 19:21:39.322290 1273587 get.go:24] failed to get user name: user is not logged in or login expired, please login again\n\n In this example, the GDC authentication session has expired and you must sign\n in to GDC again. For more information, see\n [Sign in](/distributed-cloud/hosted/docs/latest/gdch/platform/pa-user/iam/sign-in).\n\nSign into Helm with your GDC identity\n-------------------------------------\n\nUse the MHS credential helper with your GDC identity to sign into the Helm CLI.\n\nTo authenticate with Helm, follow these steps:\n\n1. After authenticating with GDC, retrieve your user credentials from the\n credential helper:\n\n echo $REGISTRY | docker-credential-mhs get\n\n The output is similar to the following: \n\n {\"Username\":\"tokenreview$fop-infrastructure-operator@example.com\",\"Secret\":\"STS-Bearer-3q2o6mBKk44Gzi4105vyiSnXMuixtnm-RnyxSgJtnYkNbGV7drpwgIuftinAXVlo0Im9kgoGmc2WcZTSjE-vh2a71Su7YjB6qIAjAQ5ABkY03AHNfkHhRZzxthumDIVAd08wm2weit3_NpMPgOnf9qMblds_Q0PAWk2OhpodBpCfyl3LWZpIZBaNVgtg-TB_7fjpEDOm-_Q5VYABScOgZFP_bw\"}\n\n2. Sign in to the Helm CLI with the credentials. When prompted to enter the\n credentials, use the credentials returned by the credential helper.\n\n helm registry login $REGISTRY\n Username: tokenreview$fop-infrastructure-operator@example.com\n Password: STS-Bearer-3q2o6mBKk44Gzi4105vyiSnXMuixtnm-RnyxSgJtnYkNbGV7drpwgIuftinAXVlo0Im9kgoGmc2WcZTSjE-vh2a71Su7YjB6qIAjAQ5ABkY03AHNfkHhRZzxthumDIVAd08wm2weit3_NpMPgOnf9qMblds_Q0PAWk2OhpodBpCfyl3LWZpIZBaNVgtg-TB_7fjpEDOm-_Q5VYABScOgZFP_bw\n\n A successful output for this operation looks like the following: \n\n Login Succeeded\n\nSign in to Docker or Helm with CLI secrets\n------------------------------------------\n\nTo sign in to Docker or Helm with CLI secrets, follow these steps:\n\n1. Sign in to Harbor with an IAP user account.\n2. Click your username and select **User Profile**.\n3. To copy the CLI secret associated with your account, click content_copy **Copy**.\n4. Optional: To display buttons for\n automatically generating or manually creating a new CLI secret, click the more_horiz ellipses in your user profile.\n\n | **Note:** A user can only have one CLI secret. When a new secret is generated or created, the old secret becomes invalid.\n5. If you generated a new CLI secret, click content_copy **Copy** to copy it.\n\n6. You can now use your CLI secret as the password when signing in to\n Harbor from the Docker or Helm CLI:\n\n docker login -u \u003cvar translate=\"no\"\u003eUSERNAME\u003c/var\u003e -p \u003cvar translate=\"no\"\u003eCLI_SECRET\u003c/var\u003e \u003cvar translate=\"no\"\u003eHARBOR_INSTANCE_URL\u003c/var\u003e\n\nReplace the following:\n\n- \u003cvar translate=\"no\"\u003eUSERNAME\u003c/var\u003e: the Harbor account username\n- \u003cvar translate=\"no\"\u003eCLI_SECRET\u003c/var\u003e: the generated CLI secret.\n- \u003cvar translate=\"no\"\u003eHARBOR_INSTANCE_URL\u003c/var\u003e: the URL of the Harbor instance.\n\n| **Note:** The CLI secret does not expire, unless you manually rotate it. The CLI secret is not associated with the user identity token. Signing out from Harbor or the GDC console does not revoke the CLI secret."]]