Skip to content
Published on

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

Authors

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

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 のデフォルト destinationlibrary/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 charthelm 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-gappedZot read-only または Harbor offline
署名 / 検証Cosign + Sigstore
サプライチェーン attestationin-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