Docker CLI无法登录Harbor(v2.2.1)报401 Unauthorized错误求助
根据你描述的情况——Harbor网页端能正常用admin/Harbor12345登录,但Docker CLI登录时返回401,核心日志提示凭证无效,且已修改内部服务URL、AWS依赖组件正常、Trivy健康检查通过——我整理了几个针对性的排查和解决方向:
1. 先通过Debug日志定位Docker CLI的请求细节
首先给docker login加上--debug参数,看看请求的完整流程:
docker login https://harbor.company.com --debug
重点关注:
- 请求的目标URL是否正确指向Harbor的registry服务(比如是否带了
/v2/路径) - 凭证是否被正确编码传递
- 响应里的具体错误信息(可能比简洁的401提示更详细)
2. 验证Harbor Registry服务的外部路由配置
你已经将registry服务的URL改为https://harbor-registry.company.com,需要确认两个关键点:
- 内部配置一致性:检查Harbor core组件的环境变量
REGISTRY_URL是否准确指向这个内部URL(可以在ECS任务的core容器配置里查看core.env)。Core服务需要通过这个地址和registry通信,完成凭证验证。 - 外部反向代理规则:AWS ALB(或你用的负载均衡)是否配置了正确的路径转发规则,将外部请求的
/v2/*路径转发到registry服务的ECS任务端口(默认是5000)。如果路径转发错误,Docker CLI的请求会被错误路由到core服务,导致认证失败。
3. 用Curl模拟登录请求,排除Docker CLI本身的问题
直接用curl发送认证请求,验证API层面是否正常:
curl -u admin:Harbor12345 https://harbor.company.com/v2/
- 如果返回
404 Not Found,说明API路径是通的(Harbor的v2根路径本身没有资源,返回404是正常的),问题可能出在Docker CLI的缓存或配置上。 - 如果还是返回
401 Unauthorized,说明问题在Harbor的服务端认证流程上,需要进一步排查core和registry的通信。
4. 检查Harbor Token服务的配置
Docker登录Harbor依赖Token认证机制,Core服务负责生成Token,Registry服务负责验证。需要确认Core的TOKEN_SERVICE_URL配置是否正确:
- 查看core容器的
core.env,确认TOKEN_SERVICE_URL设置为Core服务的内部URL,比如https://harbor-core.company.com/service/token。这个URL需要能被Registry服务访问到,否则Registry无法验证Token,会返回无效凭证的错误。
5. 排查ECS内部服务的连通性
虽然Trivy健康检查通过,但Core和Registry之间的通信可能存在问题:
- 检查ECS任务的安全组规则,确保Core服务所在的安全组能访问Registry服务的端口(默认5000)。
- 确认内部服务URL(比如
harbor-registry.company.com)能在ECS集群内部正常解析(可以通过在Core容器内执行nslookup harbor-registry.company.com验证)。
6. 清除Docker凭证缓存
有时候Docker会缓存旧的或错误的凭证,导致登录失败:
- Linux/macOS:编辑
~/.docker/config.json,删除auths下对应harbor.company.com的条目,或者直接删除文件后重新登录。 - Windows:打开Docker Desktop,进入设置→Sign in,点击"Remove Credentials",然后重新尝试登录。
总结
因为网页端能正常登录,说明用户存储(AWS RDS)和Core服务的用户认证逻辑是正常的,问题大概率出在Registry服务的外部路由、内部服务的URL配置,或者Docker CLI的凭证缓存上。按照上面的步骤逐一排查,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者Wellborn Tellis
相关产品推荐
相关产品推荐

