【まとめ】実例で覚えよう！有名なコンテナレジストリの認証コマンドとイメージ名規則

[コンテナレジストリ](https://www.redhat.com/ja/topics/cloud-native-apps/what-is-a-container-registry "コンテナレジストリとは") は、コンテナイメージを保存するためのレポジトリのことで、サービスとして提供している会社がいくつもあります。ただ、それぞれイメージ名の規則やコンテナクライアントの認証方法が異なるため、調べ直すことは多いのではないでしょうか。

この記事では、以下のコンテナレジストリの **認証コマンド** と **イメージ名の規則** を紹介します。コンテナクライアントとして **[docker](https://docs.docker.com/get-docker/ "Docker is an open platform for developing, shipping, and running applications.")** を想定しています。


- [Docker Hub](https://hub.docker.com/ "Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.")
- [AWS Elastic Container Registry (ECR)](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html "Docker イメージをプッシュする")
- [Github Container Registry (GHCR)](https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry)
- [Google Cloud Artifact Registry](https://cloud.google.com/artifact-registry "次世代の Container Registry です。 ビルド アーティファクトを保存、管理、保護します。")
- [Google Cloud Container Registry (GCR)](https://cloud.google.com/container-registry "Docker コンテナ イメージを保存、管理、保護。")

## Docker Hub

`docker login` コマンドで認証します。イメージ名は `ACCOUNT_NAME/IMAGE_NAME` のフォーマットで書きます。他のレジストリのホスト名をイメージ名の先頭につけることで、そのレジストリにプッシュできますが、つけない場合、**デフォルトで registry-1.docker.io のパブリックレジストリを使用する**ので、会社のパソコンで開発する時には気をつけましょう（私はそもそもログインしないようにしています）

```shell
# 認証
docker login

# ビルド／プッシュ
docker build -t hankehly/test-image-1 .
docker push hankehly/test-image-1
```

## AWS Elastic Container Registry (ECR)

Amazon ECRレジストリへの認証に推奨される方法は `get-login-password` コマンドです。このコマンドで認証トークンを取得して `docker login` コマンドに渡します。プッシュするイメージ用の **レポジトリ** を作成してから、そのURLをイメージ名として使います。

```shell
export AWS_ACCOUNT_ID="***"
export AWS_REGION="ap-northeast-1"
export REGISTRY_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"

# 認証
aws ecr get-login-password --region "${AWS_REGION}" | docker login --username AWS --password-stdin "${REGISTRY_URI}"

# レポジトリ作成
aws ecr create-repository --repository-name test-image-1

# ビルド／プッシュ
docker build -t "${REGISTRY_URI}/test-image-1" .
docker push "${REGISTRY_URI}/test-image-1"
```

## Github Container Registry (GHCR)

[個人アクセストークン（PAT）](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)を `docker login` コマンドに渡して認証します。イメージをプッシュするために、PATに `write:packages` のスコープを追加する必要があります。UIからPATを作ると、`repo` スコープが勝手に選択されますが、イメージ管理するだけならこの権限は不要なので、[このリンク](https://github.com/settings/tokens/new?scopes=write:packages)で `write:packages` のみ選択した状態にできます。

GCRのイメージ名は `ghcr.io/OWNER/IMAGE_NAME[:TAG]` のフォーマットで書きます。

```shell
export GCR_PAT="***"

# 認証
echo $GCR_PAT | docker login ghcr.io -u USERNAME --password-stdin

# ビルド／プッシュ
docker build ghcr.io/hankehly/test-image-1 .
docker push ghcr.io/hankehly/test-image-1
```

これで GitHub アカウントに紐づけた状態でプッシュされ、`https://github.com/{username}?tab=packages` で確認できます。さらに、Dockerfile にラベルを追加すれば、特定の GitHub レポジトリに紐付けることができます。

```
LABEL org.opencontainers.image.source="https://github.com/{owner}/{repo}"
```

プッシュ後に、レポジトリのメインページの右側にイメージ名が表示されます。

![packages-repo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525579/28f0d533-2777-f9ba-87ab-c556d93e3df2.png)

## Google Cloud Artifact Registry

`gcloud auth configure-docker` コマンドで認証します。また、`gcloud auth print-access-token` コマンドで、`docker login` コマンドに渡すためのアクセストークンを取得することも可能です。

イメージをプッシュする前に [Artifact Registry のレポジトリ](https://console.cloud.google.com/artifacts/create-repo&hl=ja) を作成する必要があります。イメージ名は `LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE` のフォーマットで書きます。

```shell
export GCP_REGION="asia-northeast1"
export GCP_PROJECT="***"
export REGISTRY_URI="${GCP_REGION}-docker.pkg.dev"

# 認証（オプション１）
gcloud auth configure-docker "${REGISTRY_URI}"
# 認証（オプション２）
# gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin "${REGISTRY_URI}"

# レポジトリ作成
gcloud artifacts repositories create my-repo --location "${GCP_REGION}" --repository-format docker

# ビルド／プッシュ
export IMAGE_NAME="${REGISTRY_URI}/${GCP_PROJECT}/my-repo/test-image-1"
docker build "${IMAGE_NAME}" .
docker push "${IMAGE_NAME}"
```

## Google Cloud Container Registry (GCR)

:::note warn
コンテナイメージを管理するための推奨サービスが Artifact Registry です。Container Registry のサポートは今後、重要なセキュリティ修正のみ継続されます。
:::

GCR は非推奨化されていますが、まだ使っている方が多いかと思います。Artifact Registry と違って、事前にレポジトリを作成する必要がないところが魅力的です。認証方法は Google Cloud Artifact Registry と同じで、イメージ名は `HOSTNAME/PROJECT-ID/IMAGE` のフォーマットで書きます。

```shell
export REGISTRY_URI="asia.gcr.io"
export GCP_PROJECT="***"
export IMAGE_NAME="${REGISTRY_URI}/${GCP_PROJECT}/test-image-1"

# 認証（オプション１）
gcloud auth configure-docker
# 認証（オプション２）
# gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin "${REGISTRY_URI}"

# ビルド／プッシュ
docker build "${IMAGE_NAME}" .
docker push "${IMAGE_NAME}"
```

## 認証済みレジストリを確認する方法

Docker CLI は、`$HOME` ディレクトリ内の `.docker` に設定ファイルを保存します。この中の `config.json` に、過去認証したことがあるレジストリ情報が入っています。

```shell
$ jq < "${HOME}"/.docker/config.json

{
  "***.dkr.ecr.us-east-1.amazonaws.com": {},
  "asia-northeast1-docker.pkg.dev": {},
  "ghcr.io": {},
  "https://index.docker.io/v1/": {}
}
```