エラーの概要
Docker の 403 エラーは、認証(ログイン)には成功したものの、対象のリソース(イメージ、レジストリ、ボリューム等)へのアクセス権限がないことを示します。これはプライベートリポジトリへのアクセス、組織内のアクセス制限、または不十分な認証トークンの権限が原因で発生することがほとんどです。Docker CLI、Docker 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 エラーが返されます。特にプライベートリポジトリの場合、認証なしでのアクセスが拒否されます。
# ログインせずにプライベートリポジトリをプルしようとする
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
公式ドキュメント参照
- Docker Hub Authentication:アクセストークンの生成と管理
- Docker Registry HTTP API:レジストリ API 仕様
- Kubernetes Image Pull Secrets:Kubernetes での認証設定
コミュニティリソース
GitHub の Docker Issues や Docker Community Forums で、同じ組織・レジストリサービス(AWS ECR、Azure Container Registry、Google Artifact Registry 等)固有の問題報告を検索し、同様のケースの解決策を確認することが有効です。特に CI/CD パイプライン内での 403 エラーは、service account の権限設定に関連することが多いため、該当サービスの公式ドキュメントも併せて確認してください。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。
この記事でエラーは解決しましたか?