Docker公共Registry API V2认证失败,寻求正确认证方式
Docker Registry API V2(Docker Hub)正确认证方式
首先确认:Docker公共Registry的地址确实是registry-1.docker.io,你的地址是对的。
直接用Docker Hub账号的用户名密码做Basic Auth请求v2/端点会返回未授权,是因为Docker Hub的V2 Registry采用Bearer Token认证机制,而非直接的Basic Auth。正确流程如下:
步骤1:获取Bearer Token
需要先向Docker Hub的认证服务器请求访问令牌,请求参数需包含目标资源的权限范围(scope)和服务标识:
- 认证地址:
https://auth.docker.io/token - 必要参数:
service=registry.docker.io(固定值,指定认证服务对应的Registry)scope:格式为repository:<仓库名>:<权限>,比如要拉取官方nginx镜像的权限,就是repository:library/nginx:pull;如果要访问自己的私有仓库,就是repository:<你的用户名>/<仓库名>:pull
- 认证方式:用Docker Hub的用户名和密码做Basic Auth
示例curl命令:
# 替换<你的用户名>、<你的密码>、<仓库范围>为实际值 curl -u "<你的用户名>:<你的密码>" "https://auth.docker.io/token?service=registry.docker.io&scope=<仓库范围>"
返回的JSON里会包含access_token字段,这就是后续API调用需要的令牌。
步骤2:使用Bearer Token调用V2 API
拿到token后,在请求V2 API的头里加入Authorization: Bearer <access_token>即可。
示例:获取官方nginx镜像的标签列表
# 替换<你的access_token>为步骤1拿到的令牌 curl -H "Authorization: Bearer <你的access_token>" "https://registry-1.docker.io/v2/library/nginx/tags/list"
常见问题说明
- 如果请求的是公开仓库,其实可以不用用户名密码,直接请求token(此时scope对应的权限是pull),认证服务器会返回无需授权的令牌
- 私有仓库必须用自己的Docker Hub账号密码获取对应权限的token
- 若返回
unauthorized,检查scope是否正确(比如仓库名是否写错,权限是否匹配),或者用户名密码是否正确
内容的提问来源于stack exchange,提问作者AchalaM
相关产品推荐
相关产品推荐

