Skip to content

필사 모드: コンテナレジストリ 2026 — Docker Hub / GHCR / ECR / Harbor / Quay / Zot / Cosign + Sigstore 徹底比較

日本語
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

プロローグ — レジストリはイメージ倉庫ではない

2015 年のコンテナレジストリはシンプルだった。`docker push` 一発で終わり。Docker Hub が事実上唯一の選択肢で、自社ホスティングが必要なら `registry:2` コンテナを 1 つ立てれば済んだ。

2026 年の景色は違う。

- **Docker Hub** の価格政策変更以降 — 無料 organization の push/pull 制限が強化され、OSS プロジェクトが続々と GHCR に移行した。

- **GHCR** は OSS コンテナの事実上のデフォルトになった。GitHub Actions と一体で、public イメージは無料、認証は `GITHUB_TOKEN` 一本で完結する。

- **ECR Public** は無料 Quay の代替として定着した。AWS アカウント 1 つでグローバル無料配信。

- **Harbor** は CNCF graduated プロジェクトとなり、自社ホスティングの標準になった。Kubernetes 上の社内レジストリはほぼ Harbor だ。

- **Zot** が CNCF incubating に上がり、OCI-only シンプルさを武器に emerging 領域を獲得した。

- **Cosign + Sigstore** は署名の事実上の標準となった。SLSA Level 3 ビルドのデフォルトツールである。

- **ORAS** はコンテナイメージ以外のすべて — Helm chart、WASM module、ML model、Terraform module — を OCI artifact として保管できるようにした。

- **SBOM(CycloneDX、SPDX)** がレジストリに添付され、イメージを受け取った瞬間に中身がわかる。

レジストリはもはや**イメージ保管庫ではなく、サプライチェーンセキュリティの中心ハブ**だ。誰がビルドし、何が入っていて、どこで検証されたか — マニフェストとともにレジストリに存在する。

本稿は 13 のレジストリ・署名ツール・SBOM 規格を一息に比較する。単なる機能表ではなく、「なぜそのチームがその選択をしたか」を辿っていく。

第 1 章 · 2026 年のコンテナレジストリ地図 — マネージド / 自社ホスティング / 無料 OSS の 3 陣営

まず 1 枚の地図。

[コンテナレジストリ 2026]

|

+---------------------+---------------------+

| | |

[マネージド SaaS] [自社ホスティング OSS] [無料 OSS ホスティング]

| | |

- Docker Hub - Harbor (CNCF) - GHCR (public free)

- GHCR (private 有料) - Zot (CNCF) - ECR Public

- GitLab Registry - Distribution - Quay.io (OSS 無料)

- AWS ECR - Artifactory CE - Docker Hub (public)

- Google AR - Nexus

- Azure ACR

- Quay.io (Red Hat)

- Artifactory (JFrog)

3 陣営の核心的な違いはシンプルだ。

1. **マネージド SaaS** — クラウドベンダーが運用、請求書で費用負担。可用性責任はベンダー。トレードオフは価格とマルチクラウド可搬性。

2. **自社ホスティング OSS** — 自前運用、インフラ費用のみ。可用性とセキュリティは自分の責任。トレードオフは運用負担。

3. **無料 OSS ホスティング** — OSS プロジェクトは公開リポジトリを無料でホスティングできる。private は別途費用または制限。

2026 年の新しい流れは「**この 3 陣営がもはや分離していない**」という点だ。

- GitHub Actions がビルドしたイメージを GHCR に push し、ECR に mirror し、Harbor に caching pull-through proxy で接続する。

- Docker Hub の価格変動で OSS プロジェクトは GHCR と Quay.io に移行したが、ユーザーの docker pull は依然として Docker Hub にも向かう — `library/nginx` のような official image はそこにある。

- エンタープライズは Artifactory の上に Harbor を置いたり、ACR をメインにして ECR を mirror にしたりする。

レジストリは**単一選択ではなく、トポロジで設計するもの**になった。

覚えておく一文:**「2026 年のレジストリ選択は単一選択ではなく、マルチレジストリトポロジの設計である」**

第 2 章 · Docker Hub — 元祖、価格変更以降

Docker Hub はコンテナレジストリの元祖だ。`docker pull nginx` が自動で向かう先であり、Official Images(公式イメージ)の正典である。

2026 年の Docker Hub の立ち位置

- 依然として **public image のデフォルト destination** — `library/`、`bitnami/`、`library/python` のような検証済みイメージはここにある。

- Official Images プログラムは依然として強力 — Docker が自ら build・署名するイメージセット。

- 価格政策は何度も変更された。無料 Team の pull/push 制限、無料 organization の image retention、非アクティブイメージの自動削除など、適用と撤回を繰り返してきた。

価格変更のインパクト

- 2023 年の無料 organization 変更告知 → OSS コミュニティの反発 → 部分撤回 → その後の段階的制限。

- 無料認証ユーザーの pull は時間あたり 100 イメージ(認証)、200 イメージ(認証された無料)。非認証は IP ベース。

- 無料 organization の unlimited public repo は維持されるが、非公開リポジトリ数と自動ビルドは制限。

- **結果**:OSS プロジェクトは GHCR、Quay.io、ECR Public に分散。Docker Hub は依然として「デフォルト destination」だが「唯一の destination」ではない。

それでも Docker Hub である理由

- **Discoverability** — 最初に探す場所。brand recognition。

- **Official Images** — 長年積み上げられた検証済みカタログ。

- **Docker Desktop 統合** — `docker login` 一本で push。

- **自動ビルド(Automated Build)** — GitHub/GitLab 連携ビルド。

`docker push` 基本フロー

1. ログイン

docker login docker.io

Username、Password (または PAT)

2. tag

docker tag myapp:latest myorg/myapp:v1.0.0

3. push

docker push myorg/myapp:v1.0.0

4. pull (他から)

docker pull myorg/myapp:v1.0.0

Pull-through cache の台頭

レジストリ hop を減らすために、多くのチームは社内 Harbor/Zot を Docker Hub の pull-through cache に置く。一度受け取ったイメージは社内にキャッシュされ、次回以降は Docker Hub の rate limit を気にする必要がない。

Harbor config — Docker Hub proxy

proxy:

remote_url: https://registry-1.docker.io

username: ""

password: ""

Docker Hub の現在地

**無料 OSS 単一正典だった時代は終わった。** しかし「公開イメージを人に露出させたいときに無視できない場所」という立ち位置は維持されている。2026 年のパターンはよくこうだ:GHCR にビルド・push → Docker Hub にも mirror → README に両方を表記。

第 3 章 · GitHub Container Registry (GHCR) — GH Actions フレンドリー

GHCR は GitHub Packages のコンテナ部分だ。2021 年 GA 以降、2026 年には OSS レジストリの事実上の標準になった。

GHCR の強み

- **GitHub Actions と一体** — `GITHUB_TOKEN` で別途資格情報なしに push。OIDC で外部インフラにも federate。

- **Public イメージは無料** — 保管と転送量は無制限。

- **リポジトリ権限を自動継承** — コード repo にアクセスできれば、イメージも pull できる。

- **OCI 1.1 完全対応** — Cosign signature、SBOM attachment、multi-arch がすべて自然に動く。

Actions から push する標準パターン

.github/workflows/build.yml

name: build-and-push

on:

push:

branches: [main]

permissions:

contents: read

packages: write

id-token: write # OIDC 用

jobs:

build:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v4

- uses: docker/setup-buildx-action@v3

- uses: docker/login-action@v3

with:

registry: ghcr.io

username: $GITHUB_ACTOR

password: $GITHUB_TOKEN

- uses: docker/build-push-action@v5

with:

push: true

tags: ghcr.io/myorg/myapp:latest

platforms: linux/amd64,linux/arm64

`ghcr.io/owner/image` 命名規則

GHCR のイメージパスは決まった形式だ:

- `ghcr.io/USERNAME/IMAGE_NAME`(個人アカウント)

- `ghcr.io/ORG_NAME/IMAGE_NAME`(組織アカウント)

このシンプルさが強力だ。`git clone github.com/foo/bar` したユーザーは `docker pull ghcr.io/foo/bar` もできる。

Private イメージの価格

- Private イメージは GitHub プランに紐づく。

- Storage と data transfer 費用が課金され、GitHub plan に応じた無料 quota がある。

- 無料 quota を超えると GB-month ベースで課金。

GHCR の制約

- **Pull 性能** — Docker Hub とほぼ同等、ただしトラフィック急増は Cloudflare cache に依存。

- **自社ホスティング不可** — マネージド only。

- **Tag immutability** — repository-wide のみ、細かい policy は不足。

OSS マイグレーションの標準経路

Docker Hub から GHCR に移行する OSS プロジェクトの標準経路:

1. GitHub Actions でマルチアーキテクチャビルド。

2. `ghcr.io/owner/project:tag` に push。

3. README の pull コマンドを GHCR 優先で更新。

4. Docker Hub にも mirror push(二重掲載)。

5. Cosign keyless で signature を添付。

覚えておく一文:**「GHCR は GitHub Actions を使う OSS の事実上の標準である。ビルド資格情報 1 行で push が終わる」**

第 4 章 · GitLab Container Registry

GitLab 内蔵のコンテナレジストリは、別途設定なしに GitLab プロジェクトごとについてくる。

GitLab Registry の強み

- **プロジェクト単位の自動分離** — `registry.gitlab.com/group/project/image:tag` パスそのまま。

- **CI/CD との深い統合** — `$CI_REGISTRY`、`$CI_REGISTRY_USER`、`$CI_REGISTRY_PASSWORD` 環境変数が自動注入。

- **Cleanup policy** — プロジェクトごとに retention rule を GUI で設定。

- **Self-managed GitLab も同じ** — GitLab CE を社内に入れればレジストリも一緒に。

`.gitlab-ci.yml` 標準 push パターン

build:

image: docker:24.0.5

services:

- docker:24.0.5-dind

variables:

DOCKER_TLS_CERTDIR: "/certs"

script:

- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .

- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest

- docker push $CI_REGISTRY_IMAGE:latest

Dependency Proxy

GitLab は Docker Hub の pull-through proxy を group 単位で内蔵している。

Docker Hub の nginx を GitLab proxy 経由で取得

docker pull gitlab.com/myorg/dependency_proxy/containers/nginx:latest

GitLab グループ単位の認証で、Docker Hub rate limit を回避する。

Cleanup Policy

プロジェクト設定 > Packages and registries > Container Registry

Cleanup policy (UI で設定、API/Terraform でも可能)

keep_n_tags_older_than: 1d

older_than: 30d

name_regex_keep: "release-.*"

name_regex_delete: ".*"

90% のユースケースをカバーするシンプルな policy エンジン。

GitLab Registry の現在地

**GitLab をすでに使っているチームの自然な選択**だ。CI と権限モデルが 1 か所に統合される。Self-managed でも同じ経験。ただし GitLab 外のユーザーへの discoverability は GHCR より低い。

第 5 章 · AWS ECR + ECR Public — 無料 Quay 代替

ECR(Elastic Container Registry)は AWS の private コンテナレジストリだ。2020 年に ECR Public が追加され、public 領域もカバーする。

ECR の強み

- **IAM 統合** — IAM role/policy ベースの精密認証。EKS pod に IRSA(IAM Roles for Service Accounts)で資格情報を注入。

- **Cross-region replication** — マルチリージョン自動複製。

- **イメージスキャン内蔵** — Amazon Inspector 統合、CVE 自動検査。

- **Pull-through cache** — Docker Hub、GHCR、Quay、mcr.microsoft.com をキャッシュ。

- **Lifecycle policy** — JSON DSL で retention policy。

`aws ecr get-login-password` フロー

1. ログイン (12 時間有効トークン)

aws ecr get-login-password --region us-east-1 \

| docker login --username AWS --password-stdin \

123456789012.dkr.ecr.us-east-1.amazonaws.com

2. repository 作成 (自動作成も可能)

aws ecr create-repository --repository-name myapp

3. push

docker tag myapp:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:v1

docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:v1

Lifecycle Policy 例

{

"rules": [

{

"rulePriority": 1,

"description": "Keep last 10 production images",

"selection": {

"tagStatus": "tagged",

"tagPrefixList": ["prod-"],

"countType": "imageCountMoreThan",

"countNumber": 10

},

"action": { "type": "expire" }

},

{

"rulePriority": 2,

"description": "Expire untagged after 7 days",

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 7

},

"action": { "type": "expire" }

}

]

}

ECR Public — 無料 OSS ホスティング

`public.ecr.aws/` は AWS アカウント 1 つで OSS イメージを無料でグローバルホスティングできる。

- 保管無料 (50 GB / repo 推奨上限)。

- Data transfer 無料(anonymous pull も無料)。

- 別ドメイン(`public.ecr.aws/aws/amazonlinux:2023` のような)。

OSS プロジェクトが Docker Hub rate limit と GHCR private 費用を回避するために ECR Public を追加するパターンが一般的だ。

ECR の制約

- **AWS lock-in** — multi-cloud 使用時は別途 push が必要。

- **リクエスト量ベース費用** — pull リクエストにも価格が付くことがある(public は無料)。

- **UI はコンソール only** — Harbor/GitLab のようなフル GUI なし。

ECR の現在地

**AWS で EKS・ECS・Lambda を回すチームのデフォルト。** IRSA との結合が圧倒的にきれいだ。OSS は ECR Public を補助 destination として置くのがよい。

第 6 章 · Google Artifact Registry — GCR 後継

Google Artifact Registry(AR)は Google Container Registry(GCR)の公式後継だ。GCR(`gcr.io`)は deprecated になり、Artifact Registry への移行が強く推奨されている。

AR が GCR を置き換えた理由

- **多形式対応** — コンテナだけでなく Maven、npm、Python、Go、Helm、Debian、RPM、Apt まで 1 つのレジストリで。

- **VPC Service Controls** — ネットワーク境界 policy。

- **CMEK(顧客管理暗号化キー)** — 細かい暗号化制御。

- **Regional/Multi-regional repo** — GCR より精密な地域選択。

- **IAM 精密権限** — repo 単位の権限分離。

GCR からのマイグレーション

既存 gcr.io イメージを AR にマイグレーション

gcloud artifacts docker upgrade migrate \

--projects=my-project

新 AR repo 作成

gcloud artifacts repositories create myrepo \

--repository-format=docker \

--location=us-central1 \

--description="Docker repo"

認証ヘルパー設定

gcloud auth configure-docker us-central1-docker.pkg.dev

push

docker tag myapp:latest \

us-central1-docker.pkg.dev/my-project/myrepo/myapp:v1

docker push us-central1-docker.pkg.dev/my-project/myrepo/myapp:v1

GKE Workload Identity Federation

Kubernetes ServiceAccount -> GCP ServiceAccount マッピング

apiVersion: v1

kind: ServiceAccount

metadata:

name: app-sa

namespace: default

annotations:

iam.gke.io/gcp-service-account: my-gcp-sa@my-project.iam.gserviceaccount.com

これにより GKE pod が別途 secret なしで AR から pull する。

AR の強み

- **Container Analysis 統合** — 自動 vulnerability scan。

- **Binary Authorization** — admission control で署名されたイメージのみ deploy を許可。

- **Cosign 対応** — keyless 署名を GAR に添付。

- **Remote/Virtual repo** — Docker Hub の pull-through proxy。

AR の現在地

**GKE 中心の GCP ユーザーの自然な選択。** Binary Authorization と組み合わせれば、admission 段階で署名・脆弱性・policy を一度に検査できる。

第 7 章 · Azure Container Registry (ACR)

ACR は Azure のマネージドコンテナレジストリだ。AKS、App Service、Functions、Container Apps など Azure のあらゆるコンテナワークロードのデフォルト source。

ACR の強み

- **Geo-replication** — Premium ティアでグローバル自動複製、single endpoint URL。

- **ACR Tasks** — レジストリ内ビルド(クラウドサイドビルド)。

- **Content trust(Notary v1) と Cosign の両方を対応。**

- **Helm chart、OCI artifact 対応。**

- **Private link** — 完全なプライベートネットワークアクセス。

`az acr login` フロー

1. ログイン (Azure CLI 資格情報を使用)

az acr login --name myregistry

2. ACR リポへ push

docker tag myapp:latest myregistry.azurecr.io/myapp:v1

docker push myregistry.azurecr.io/myapp:v1

3. AKS で pull (Managed Identity)

ImagePullSecret なしで IAM 統合を使用

ACR Tasks — レジストリ内ビルド

Git commit に対応して自動ビルド

az acr task create \

--name buildmyapp \

--registry myregistry \

--image myapp:$ID \

--context https://github.com/myorg/myapp.git \

--file Dockerfile \

--git-access-token $TOKEN

このモデルではビルドマシンを別途持つ必要がない。Buildah ベースの cloud-side build。

Retention policy

az acr config retention update \

--registry myregistry \

--status enabled \

--days 30 \

--type UntaggedManifests

韓国 / 日本での使用

- **カカオペイ**は Azure をメインクラウドの 1 つとして使用し、ACR で社内イメージを管理している(公開された社内技術ブログに基づく)。

- 日本のゲーム会社の一部も Azure をメインに据えて ACR を使用している。

ACR の現在地

**AKS・Azure DevOps を使うチームのデフォルト。** Geo-replication が single endpoint URL で動作する点は ECR より運用がシンプルだ。

第 8 章 · Harbor (CNCF graduated) — 自社ホスティングの標準

Harbor は VMware が始めて CNCF に寄贈された OSS レジストリだ。2020 年に CNCF graduated プロジェクトとなり、2026 年には自社ホスティングの標準になった。

Harbor が自社ホスティング標準になった理由

- **フル GUI** — ユーザー・プロジェクト・権限・policy・複製まで Web UI で。

- **Project 単位の隔離** — multi-tenancy。

- **Vulnerability scanner 統合** — Trivy 標準、Clair・Snyk・Anchore も plugin。

- **Cosign・Notary 対応** — 署名検証を admission 段階に統合。

- **Replication policy** — Docker Hub、GHCR、ECR、GAR、ACR、Quay などに単方向/双方向複製。

- **Proxy cache** — 外部レジストリの pull-through cache。

- **Robot account** — CI 用 long-lived 資格情報、権限の精密調整。

Harbor 設置 (Helm)

helm repo add harbor https://helm.goharbor.io

helm install harbor harbor/harbor \

--namespace harbor --create-namespace \

--set expose.type=ingress \

--set expose.ingress.hosts.core=harbor.example.com \

--set externalURL=https://harbor.example.com \

--set persistence.persistentVolumeClaim.registry.size=200Gi \

--set persistence.persistentVolumeClaim.chartmuseum.size=10Gi \

--set persistence.persistentVolumeClaim.trivy.size=20Gi

Project · Robot · Replication の典型構造

[Harbor Project: production]

- Member: dev-team (Developer)

- Member: ops-team (Master)

- Robot: ci-build (push)

- Robot: ci-deploy (pull)

- Vulnerability Scanner: Trivy

- Cosign Signature: required (deploy 時に検証)

- Replication:

- to: ghcr.io/myorg (push, on push)

- from: docker.io/library/* (pull, on demand)

Pull-through Proxy Cache

Harbor Project = "dockerhub-proxy"

外部 endpoint: https://registry-1.docker.io

Cache TTL: 24h

ユーザー使用:

docker pull harbor.example.com/dockerhub-proxy/library/nginx:latest

初回 pull -> Docker Hub を経由してキャッシュ

2 回目 pull -> Harbor 内部から直接

このパターン 1 つで Docker Hub rate limit が解決する。

Harbor の制約

- **運用負担** — Postgres・Redis・Trivy・Notary・Chartmuseum などの複数コンポーネント。

- **upgrade が難しい** — メジャーバージョン間で schema 変更がしばしばある。

- **独自バックアップ戦略が必要** — イメージ blob とメタデータの両方。

Harbor の現在地

**自社ホスティングコンテナレジストリのデフォルト。** GUI と replication が強力で、運用チームが非開発者でも使用可能。大規模社内インフラでよく使われる。

第 9 章 · Quay (Red Hat / IBM)

Quay は Red Hat が買収したコンテナレジストリだ。Quay.io はマネージド SaaS、Red Hat Quay は自社ホスティング enterprise edition、Project Quay は OSS upstream。

Quay の強み

- **OpenShift と一体** — OpenShift 使用時の自然な選択。

- **Quay.io OSS free** — public repository は無料(特に Red Hat ecosystem)。

- **OSS organization 無料 unlimited private** — 一部の OSS プロジェクトに提供。

- **Clair scanner 内蔵** — Quay チームが作った vulnerability scanner。

- **Geo-replication** — multi-region replication を内蔵。

- **Notary v2 + Cosign 対応。**

Quay 使用パターン

Quay.io

docker login quay.io

docker push quay.io/myorg/myapp:v1

Self-managed Red Hat Quay

docker login quay.mycompany.com

docker push quay.mycompany.com/team/myapp:v1

Robot Account モデル

Harbor と似ている。CI 用の長期トークンを発行し、repository 単位で権限を付与。

Quay の現在地

- **Red Hat ecosystem(OpenShift、RHEL)ではデフォルト。**

- 自社ホスティング enterprise で Harbor と二分。

- OSS ホスティングで Docker Hub の無料代替の 1 つ。

第 10 章 · Zot (CNCF incubating) — OCI-only シンプル

Zot は OCI-only コンテナレジストリだ。2024 年に CNCF incubating プロジェクトとなり、「シンプル・小さい・速い」自社ホスティング選択肢として浮上した。

Zot がシンプルさを武器に浮上した理由

- **OCI distribution spec のみ実装** — Docker registry v1 なし、独自拡張なし。

- **単一バイナリ** — Go 単一ファイル。Postgres・Redis 依存なし。

- **読み取り専用モード** — air-gapped 環境に適合。

- **Sync** — 他のレジストリから sync して mirror。

- **メタデータ plugin** — Cosign signature、SBOM 検索。

Zot 実行

単一 binary

./zot serve config.json

config.json

{

"storage": {

"rootDirectory": "/var/lib/zot"

},

"http": {

"address": "0.0.0.0",

"port": "5000"

},

"log": {

"level": "info"

},

"extensions": {

"search": { "enable": true },

"sync": {

"enable": true,

"registries": [

{

"urls": ["https://docker.io"],

"content": [{ "prefix": "library/nginx" }],

"onDemand": true

}

]

}

}

}

これがすべて。Postgres も Redis も別途コンポーネントもない。

Zot の現在地

- **Air-gapped 環境** — 単一 binary、読み取り専用モード。

- **Edge / IoT** — 小さいリソースで動作。

- **開発環境のローカル registry** — Harbor が過剰な場合。

- **GitHub Actions runner に紐付けた使い捨て registry として** — 単体テスト。

覚えておく一文:**「Harbor がフル GUI 総合レジストリなら、Zot は OCI distribution spec の reference のようなシンプルさだ」**

第 11 章 · JFrog Artifactory — 全言語エンタープライズ

Artifactory は JFrog の universal アーティファクトレジストリだ。Docker コンテナだけでなく Maven・Gradle・npm・NuGet・PyPI・CocoaPods・Conan・Cargo・Helm などあらゆるパッケージマネージャを 1 か所で管理する。

Artifactory の強み

- **全言語を 1 か所で** — コンテナだけ分ける必要がない。

- **Remote repo** — あらゆる外部レジストリの pull-through cache。

- **Virtual repo** — 複数の repo を 1 つの endpoint にまとめる。

- **Build info 追跡** — どのビルドがどのアーティファクトを生み出したかのグラフ。

- **JFrog Xray** — vulnerability scanning、SBOM 統合。

- **JFrog Distribution** — グローバル配信 entry point。

- **JFrog Pipelines** — CI/CD 統合。

Artifactory の現在地

- **大型エンタープライズ** — コンテナ以外のアーティファクトが多い時。

- **金融、通信、製造業** — Java とコンテナを一緒に管理する時。

- **ライセンス費用負担が可能** — 価格が負担になれば Harbor が代替。

Artifactory CE — Community Edition

Docker のみ無料。フル機能は有償ライセンスが必要。

第 12 章 · Distribution (CNCF) — OCI 参照実装

Distribution は Docker が作った OSS レジストリ実装だ。2018 年に CNCF へ寄贈され Distribution として再出発、OCI distribution spec の reference implementation の役割を担う。

Distribution の現在地

- **`registry:2` コンテナ** — 最もシンプルな社内レジストリ。

- **OCI spec reference** — spec 変更時に最初に実装される。

- **他のレジストリの base** — Harbor、Zot、GHCR などが内部的に distribution またはその fork を使用。

Distribution 実行

最もシンプルな社内 registry

docker run -d -p 5000:5000 --restart=always \

-v /opt/registry-data:/var/lib/registry \

--name registry \

registry:2

使用

docker tag myapp:latest localhost:5000/myapp:v1

docker push localhost:5000/myapp:v1

Distribution の制約

- **認証/権限モデルなし** — basic auth または reverse proxy で自前実装。

- **UI なし** — 別途 frontend が必要。

- **scanner なし** — 別途ツール統合が必要。

Distribution の現在地

- **開発用の単一ノード registry。**

- **他のレジストリの building block。**

- **OCI spec 学習や reference 実装確認用。**

ほとんどの production 事例では Harbor・Zot・GHCR へ移動した。

第 13 章 · Sonatype Nexus

Nexus Repository は Sonatype の universal アーティファクトレジストリだ。Artifactory と同じ位置 — あらゆるパッケージマネージャ + Docker。

Nexus の強み

- **Nexus Repository OSS** — 無料、Docker proxy/host/group 対応。

- **Maven 生態系の事実上の標準** — Java バックエンド企業はすでに Nexus を持っている。

- **相対的に軽い** — Artifactory より運用シンプル。

- **Nexus IQ Server** — vulnerability・license・policy 検査。

Nexus 使用

Nexus に hosted docker repo を作成後

docker login nexus.example.com:8082

docker push nexus.example.com:8082/myapp:v1

Nexus の現在地

- **すでに Nexus を使う Maven/Gradle チーム** — Docker も自然に追加。

- **Artifactory の無料代替。**

- **ただしコンテナ専用機能(scanner、replication)は Harbor に比べて弱い。**

第 14 章 · Cosign + Sigstore — イメージ署名標準

Sigstore は OSS サプライチェーンセキュリティのための非営利プロジェクトだ。Cosign はそのコンテナイメージ署名ツール。

Sigstore の構成要素

- **Cosign** — 署名/検証 CLI。

- **Fulcio** — short-lived 証明書 CA (OIDC identity -> X.509 cert)。

- **Rekor** — append-only transparency log。

- **TUF** — root of trust 配布。

Keyless 署名 — 2026 年のデフォルト

1. キーなしで署名 (OIDC identity を使用)

cosign sign ghcr.io/myorg/myapp:v1

ブラウザが開く -> GitHub/Google/Microsoft OIDC ログイン

Fulcio が short-lived cert を発行

Rekor に署名を記録

Cosign が cert + signature をレジストリに push

2. 検証

cosign verify ghcr.io/myorg/myapp:v1 \

--certificate-identity=user@example.com \

--certificate-oidc-issuer=https://accounts.google.com

キーを持ち歩く必要がない。**OIDC identity がそのまま署名者だ。**

GitHub Actions 自動署名

permissions:

id-token: write # OIDC token 発行用

contents: read

packages: write

jobs:

build-and-sign:

runs-on: ubuntu-latest

steps:

- uses: docker/build-push-action@v5

id: build

with:

push: true

tags: ghcr.io/myorg/myapp:latest

- uses: sigstore/cosign-installer@v3

- run: cosign sign --yes ghcr.io/myorg/myapp@$DIGEST

env:

DIGEST: ${{ steps.build.outputs.digest }}

GitHub Actions の OIDC identity が署名に埋め込まれる。検証時に `--certificate-identity-regexp=https://github.com/myorg/.*` で「この organization の GitHub Actions がビルドしたもの」であることを保証。

Admission Control 統合

Kyverno policy 例

apiVersion: kyverno.io/v1

kind: ClusterPolicy

metadata:

name: require-cosign-signature

spec:

validationFailureAction: enforce

rules:

- name: verify-image

match:

any:

- resources:

kinds: [Pod]

verifyImages:

- imageReferences:

- "ghcr.io/myorg/*"

attestors:

- entries:

- keyless:

subject: "https://github.com/myorg/.*"

issuer: "https://token.actions.githubusercontent.com"

この policy 1 つで、クラスターには「myorg の GitHub Actions でビルドされたイメージ」のみが deploy される。

Cosign + Sigstore の現在地

**2026 年のコンテナ署名の事実上の標準。** Docker Content Trust(Notary v1)は事実上 deprecated、Notary v2 は OCI spec 標準化進行中。実戦では Cosign が最も広く使われる。

第 15 章 · in-toto / SBOM (CycloneDX, SPDX) / Notary v2 — サプライチェーンセキュリティ

署名だけでは足りない。「誰がこのイメージをビルドしたか?」の上に「このイメージの中に何が入っているか?」「このイメージがどんな過程を経てビルドされたか?」が必要だ。

in-toto — サプライチェーン attestation

in-toto はビルドパイプライン各段階の attestation を作る framework だ。

{

"_type": "https://in-toto.io/Statement/v1",

"subject": [{

"name": "ghcr.io/myorg/myapp",

"digest": { "sha256": "abc123..." }

}],

"predicateType": "https://slsa.dev/provenance/v1",

"predicate": {

"buildDefinition": {

"buildType": "https://github.com/Attestations/GitHubActions/v1",

"externalParameters": {

"workflow": ".github/workflows/build.yml",

"ref": "refs/heads/main"

}

},

"runDetails": {

"builder": { "id": "https://github.com/actions/runner@v2.319.0" },

"metadata": {

"invocationId": "https://github.com/myorg/myapp/actions/runs/12345"

}

}

}

}

SLSA(Supply-chain Levels for Software Artifacts) Level 3 ビルドの核心。

SBOM — Software Bill of Materials

イメージ内のすべての依存関係のリスト。

CycloneDX

OWASP が作った SBOM 標準。

Syft で SBOM 生成 (CycloneDX フォーマット)

syft ghcr.io/myorg/myapp:v1 -o cyclonedx-json > sbom.cdx.json

イメージに attach (Cosign)

cosign attach sbom --sbom sbom.cdx.json \

--type cyclonedx ghcr.io/myorg/myapp:v1

SPDX

Linux Foundation の SBOM 標準。

syft ghcr.io/myorg/myapp:v1 -o spdx-json > sbom.spdx.json

cosign attach sbom --sbom sbom.spdx.json \

--type spdx ghcr.io/myorg/myapp:v1

両フォーマットとも ISO 標準化済み。どちらを選んでもツール互換性は良い。CycloneDX は vulnerability 統合が強く、SPDX は ライセンス追跡が強い。

Notary v2 — OCI 署名標準

Notary v1(Docker Content Trust)は事実上 deprecated。Notary v2 は OCI artifact spec の上で署名を標準化する。

- **OCI artifact spec を活用** — 署名を別の manifest として保存。

- **ACR、Quay でデフォルト対応** — `notation` CLI で署名/検証。

- **Cosign と共存** — Notary v2 spec に Cosign が alternate signer として登録。

Notation CLI (Notary v2 reference impl)

notation sign --plugin azure-kv \

--id "https://myvault.vault.azure.net/keys/mykey/abc123" \

myregistry.azurecr.io/myapp:v1

notation verify \

--signature myregistry.azurecr.io/myapp:v1

in-toto / SBOM / Notary v2 の現在地

- **in-toto** — SLSA Level 3 ビルドの証言。SLSA L3 を達成するには事実上必須。

- **SBOM** — 規制(EO 14028、EU CRA)対応に必須。

- **Notary v2** — ACR・Quay 中心で採用。Cosign の方が広く使われているが、ecosystem 分布は近い。

覚えておく一文:**「2026 年のサプライチェーンセキュリティは、署名(Cosign) + 証言(in-toto) + 部品表(SBOM)の 3 点セットだ」**

第 16 章 · ORAS — generic OCI artifact

ORAS(OCI Registry As Storage)はコンテナイメージ以外のすべて — Helm chart、WASM module、ML model、Terraform module、OPA bundle — を OCI artifact として保管するツールだ。

ORAS の動機

OCI distribution spec はイメージだけでなく任意の artifact を保管できる。しかしクライアントツールが不足していた。ORAS がその穴を埋める。

任意のファイルを OCI artifact として push

oras push ghcr.io/myorg/wasm-modules:v1 \

./module.wasm:application/wasm

pull

oras pull ghcr.io/myorg/wasm-modules:v1

manifest 確認

oras manifest fetch ghcr.io/myorg/wasm-modules:v1

ORAS の活用事例

- **Helm chart** — `helm push my-chart-1.0.0.tgz oci://registry.example.com/charts`

- **WASM module** — wasmCloud、Krustlet が OCI registry から module を pull。

- **ML model** — KServe、ModelMesh が model を OCI artifact として配布。

- **OPA bundle、Cosign signature、SBOM** — すでに OCI artifact だ。

ORAS の現在地

**コンテナレジストリが universal artifact registry に進化する推進力。** Helm・WASM・ML model などがすべて OCI registry の上に移っていく流れの中心。

第 17 章 · 韓国 / 日本 — トス、カカオペイ、メルカリ、LINE

韓国

- **トス** — 社内自社レジストリを運用(自社ビルドの社内ツール + Harbor ベース)し、OSS イメージの pull-through proxy としても活用。社内開発カンファレンスの発表で、社内ビルドパイプラインが自社 registry に push される構造が共有された。

- **カカオペイ** — Azure をメインクラウドの 1 つとして使用し、ACR を中核のコンテナレジストリとして運用(公開された社内技術ブログに基づく)。

- **ネイバー / LINE 韓国** — マルチクラウド(NCP 含む)と社内 registry の組み合わせ。

- **韓国の OSS プロジェクト** — GHCR 優先、Docker Hub mirror パターンが増加。

日本

- **メルカリ** — マルチクラウド + GitHub Actions + GHCR を中心とするビルドパイプライン。一部ワークロードは GCP Artifact Registry に直接。

- **LINE** — 社内独自コンテナプラットフォーム上に独自レジストリを運用。Harbor ベース構造が社内カンファレンス発表で言及されたことがある。

- **サイバーエージェント / DeNA** — GKE・EKS 混合、GAR・ECR 混合。

- **日本の OSS プロジェクト** — GHCR + Docker Hub 二重掲載が多い。

韓国・日本共通パターン

- 社内コアインフラは**自社ホスティング(Harbor)またはマネージド(ACR/ECR/GAR)** + **外部 mirror として GHCR**。

- OSS ビルドは事実上 **GitHub Actions + GHCR + Cosign keyless** が標準。

- Docker Hub は「公開露出用の補助 destination」。

第 18 章 · 誰が何を選ぶべきか — OSS / スタートアップ / エンタープライズ / エアギャップ

OSS プロジェクト — GHCR

- ビルド無料(Actions)、保管無料(public)。

- Cosign keyless 署名が OIDC で自動。

- README に `ghcr.io/org/project` の 1 行で案内。

- 追加で Docker Hub にも mirror push(ユーザー露出用)。

スタートアップ — メインクラウドのマネージド + GHCR

- AWS なら ECR、GCP なら GAR、Azure なら ACR。

- CI は GitHub Actions -> GHCR -> メインクラウド registry に mirror。

- 運用負担を最小化。

中堅企業 — Harbor + メインクラウド

- 社内 Harbor 1 つ、メインクラウドマネージド 1 つ。

- Pull-through proxy で Docker Hub rate limit を回避。

- Cosign + Trivy で admission control。

大型エンタープライズ — Artifactory または Harbor + マルチクラウド

- コンテナ以外のアーティファクト(Maven、npm)が多ければ Artifactory。

- コンテナ中心なら Harbor + クラウドマネージド。

- Cosign + Notary v2 + SBOM + in-toto attestation のフルスタック。

エアギャップ / 政府・金融セキュリティ網 — Zot または Harbor offline

- Zot の read-only mode + 単一 binary が air-gapped に強い。

- Harbor の offline installer + replication for sync。

- SBOM、Cosign signature まで air-gapped で sync。

意思決定マトリクス

| 条件 | 推奨 |

| --- | --- |

| OSS プロジェクト | GHCR (+ Docker Hub mirror) |

| AWS 単一クラウド | ECR (+ ECR Public for OSS) |

| GCP 単一クラウド | Google Artifact Registry |

| Azure 単一クラウド | ACR |

| GitLab 使用中 | GitLab Container Registry |

| OpenShift 使用中 | Red Hat Quay |

| 自社ホスティング、フル GUI 必要 | Harbor |

| 自社ホスティング、シンプルさ優先 | Zot |

| 全言語 + コンテナ統合 | Artifactory または Nexus |

| Air-gapped | Zot read-only または Harbor offline |

| 署名 / 検証 | Cosign + Sigstore |

| サプライチェーン attestation | in-toto + SLSA |

| 部品表 | CycloneDX または SPDX |

| Helm/WASM/ML model 保管 | ORAS + OCI registry |

エピローグ — レジストリはすでにサプライチェーンセキュリティの中心だ

2026 年のコンテナレジストリは、もはや「イメージを保管する場所」ではない。

- イメージに**署名**が付き(Cosign)、

- イメージに**部品表**が付き(SBOM)、

- イメージに**ビルド証言**が付き(in-toto)、

- イメージが**複数レジストリへ mirror** され(Harbor replication)、

- イメージが**admission 段階で検証**され(Kyverno、Binary Authorization)、

- コンテナ以外のすべて(Helm、WASM、ML model)も同じ registry の上に住む(ORAS)。

レジストリ 1 つを選ぶのではなく、**サプライチェーンセキュリティトポロジの中心ノードを設計する**仕事になった。

そしてツール選択は単純な機能表ではなく、**クラウド選択 + CI 選択 + 運用能力 + 規制要件**の関数だ。本稿がその関数の入力値を捉える助けになれば幸いだ。

最後の一文:**レジストリは終点ではなく始点だ。** イメージがその中に入った瞬間、サプライチェーンのすべての鎖がそこから検証される。

参考 / References

- Docker Hub Documentation — https://docs.docker.com/docker-hub/

- Docker Hub Subscription Pricing — https://www.docker.com/pricing/

- GitHub Container Registry Docs — https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry

- GHCR for Actions — https://docs.github.com/en/actions/publishing-packages/publishing-docker-images

- GitLab Container Registry — https://docs.gitlab.com/ee/user/packages/container_registry/

- GitLab Dependency Proxy — https://docs.gitlab.com/ee/user/packages/dependency_proxy/

- AWS ECR User Guide — https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html

- ECR Public Gallery — https://gallery.ecr.aws/

- ECR Lifecycle Policies — https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html

- Google Artifact Registry — https://cloud.google.com/artifact-registry/docs

- GAR Migration from GCR — https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr

- Binary Authorization — https://cloud.google.com/binary-authorization

- Azure Container Registry — https://learn.microsoft.com/en-us/azure/container-registry/

- ACR Tasks — https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tasks-overview

- Harbor Project — https://goharbor.io/

- Harbor Docs — https://goharbor.io/docs/

- CNCF Harbor Graduation Announcement — https://www.cncf.io/announcements/2020/06/23/cloud-native-computing-foundation-announces-harbor-graduation/

- Project Quay — https://www.projectquay.io/

- Red Hat Quay — https://www.redhat.com/en/technologies/cloud-computing/quay

- Zot Registry — https://zotregistry.dev/

- CNCF Zot Incubation — https://www.cncf.io/projects/zot/

- JFrog Artifactory — https://jfrog.com/artifactory/

- Sonatype Nexus Repository — https://www.sonatype.com/products/sonatype-nexus-repository

- CNCF Distribution — https://distribution.github.io/distribution/

- OCI Distribution Spec — https://github.com/opencontainers/distribution-spec

- OCI Image Spec — https://github.com/opencontainers/image-spec

- Sigstore — https://www.sigstore.dev/

- Cosign Docs — https://docs.sigstore.dev/cosign/

- Rekor Transparency Log — https://docs.sigstore.dev/rekor/overview

- Fulcio CA — https://docs.sigstore.dev/fulcio/overview

- in-toto — https://in-toto.io/

- in-toto attestations — https://github.com/in-toto/attestation

- SLSA Framework — https://slsa.dev/

- CycloneDX — https://cyclonedx.org/

- SPDX — https://spdx.dev/

- Syft (SBOM tool) — https://github.com/anchore/syft

- Notary Project (v2) — https://notaryproject.dev/

- ORAS Project — https://oras.land/

- Kyverno verifyImages — https://kyverno.io/docs/policy-types/verify-images/

- Trivy Scanner — https://trivy.dev/

현재 단락 (1/559)

2015 年のコンテナレジストリはシンプルだった。`docker push` 一発で終わり。Docker Hub が事実上唯一の選択肢で、自社ホスティングが必要なら `registry:2` コンテナ...

작성 글자: 0원문 글자: 25,493작성 단락: 0/559