エラーの概要

Docker の 403 エラーは、認証ログイン)には成功したものの、対象のリソース(イメージレジストリ、ボリューム等)へのアクセス権限がないことを示します。これはプライベートリポジトリへのアクセス、組織内のアクセス制限、または不十分な認証トークン権限が原因で発生することがほとんどです。Docker CLIDocker Desktop、または docker push/pull 時に頻繁に遭遇するエラーです。

実際のエラーメッセージ例

Error response from daemon: Head "https://registry-1.docker.io/v2/myuser/myimage/manifests/latest": 
unauthorized: authentication required
403 Forbidden
{
  "errors": [
    {
      "code": "DENIED",
      "message": "permission denied",
      "detail": "requested access to the resource is denied"
    }
  ]
}
docker push myrepo/myimage:tag
denied: requested access to the resource is denied

よくある原因と解決手順

原因1:Docker Hub のログイン認証が無効または権限不足

なぜ発生するか:Docker CLIログインしていない状態、または無効なトークンリポジトリにアクセスしようとすると、403 エラーが返されます。特にプライベートリポジトリの場合、認証なしでのアクセスが拒否されます。

Before(エラーが起きるコマンド

# ログインせずにプライベートリポジトリをプルしようとする
docker pull myusername/private-image:latest

# または古い認証情報で実行
docker push myrepo/myimage:tag

After(修正後のコマンド

# Docker Hub にログイン
docker login

# プロンプトで以下を入力:
# Username: <your-username>
# Password: <your-password-or-access-token>

# その後にプルまたはプッシュを実行
docker pull myusername/private-image:latest
docker push myrepo/myimage:tag

認証情報が有効か確認する方法:

# ログイン状態を確認
cat ~/.docker/config.json | jq '.auths'

# 認証トークンをリフレッシュ
docker logout
docker login

原因2:リポジトリの所有者または権限設定が不一致

なぜ発生するか:Docker Hub でリポジトリを作成した時点の所有者と異なるアカウント、または組織に属さないユーザーがアクセスしようとすると、権限不足で 403 が返されます。

Before(エラーが起きる状況)

# ユーザーAが作成した org/repo にユーザーBがログインしてアクセス
docker login  # ユーザーB としてログイン
docker push org/repo:v1.0
# Error: denied: requested access to the resource is denied

After(修正後の対応)

リポジトリの所有者が Docker Hub Web UI でアクセス権限を明示的に付与する必要があります:

Docker Hub Web UI > Repository > Settings > Collaborators
→ ユーザーB を追加し、"Write" 権限を付与

その後、ユーザーB は以下を実行:

docker logout
docker login  # ユーザーB で再度ログイン
docker push org/repo:v1.0

原因3:プライベートレジストリの認証情報が Kubernetes に未登録

なぜ発生するか:Docker コンテナKubernetes クラスタで実行する際、プライベートレジストリの認証情報が ImagePullSecret として登録されていないため、kubelet がイメージ取得時に 403 エラーを受け取ります。

Before(エラーが起きる設定)

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: myregistry.azurecr.io/myimage:latest
  # imagePullSecrets が指定されていない → 403 エラー

After(修正後の設定)

# まずシークレットを作成
kubectl create secret docker-registry myregistrysecret \
  --docker-server=myregistry.azurecr.io \
  --docker-username=<your-username> \
  --docker-password=<your-password> \
  --docker-email=<your-email>
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: myregistry.azurecr.io/myimage:latest
  imagePullSecrets:
  - name: myregistrysecret  # ← シークレット参照を追加

Docker 固有の注意点

Docker Desktop での認証の永続化

Docker Desktop(Mac/Windows)では、~/.docker/config.json に認証情報が保存されますが、Credential Helper を使用している場合、トークンの有効期限切れが原因で 403 が発生することがあります。その場合は以下を実行:

# Credential Helper を経由してキャッシュを削除
docker logout
docker login --username <your-username>

Docker Compose と認証

Docker Compose でプライベートイメージを使用する場合、以下のように .env ファイルまたは docker-compose.yml で認証を明示的に指定できます:

version: '3.9'
services:
  myapp:
    image: myregistry.example.com/myimage:latest
    # Compose は docker login の認証情報を自動的に使用するため、
    # 別途設定は不要だが、CI/CD環境では明示的に login が必要

Docker Registry API での 403

自身が構築したプライベート Docker Registry(Docker Distribution)にアクセスする場合、Basic 認証またはトークン認証が有効か確認:

# Basic 認証でテスト
curl -u username:password https://your-registry.com/v2/

# 401 が返されたら、認証情報が間違っている
# 403 が返されたら、ユーザーに対象リポジトリへのアクセス権限がない

それでも解決しない場合

確認すべきログと情報

Docker デーモンログを確認して詳細なエラーを特定します:

# Docker Desktop (Mac)
cat ~/Library/Containers/com.docker.docker/Data/log/vm/docker.log

# Docker Desktop (Windows)
type "%APPDATA%\Docker\log.txt"

# Docker Engine (Linux)
journalctl -u docker --no-pager | tail -50

レジストリへのアクセステストを以下で実施:

# 認証情報の確認
docker info | grep "Registries"

# 特定のリポジトリへの権限テスト
curl -H "Authorization: Bearer $(cat ~/.docker/config.json | jq -r '.auths["registry-1.docker.io"].auth')" \
  https://registry-1.docker.io/v2/<your-repo>/manifests/latest

公式ドキュメント参照

コミュニティリソース

GitHubDocker Issues や Docker Community Forums で、同じ組織・レジストリサービス(AWS ECR、Azure Container Registry、Google Artifact Registry 等)固有の問題報告を検索し、同様のケースの解決策を確認することが有効です。特に CI/CD パイプライン内での 403 エラーは、service account の権限設定に関連することが多いため、該当サービスの公式ドキュメントも併せて確認してください。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。