镜像仓库访问认证与权限设置需匹配仓库类型:Docker Hub用PAT更安全,Harbor/自建Registry支持LDAP/OIDC,云厂商ACR/ECR对接IAM,私有HTTP仓库需配置insecure-registries;登录凭据存config.json,企业级场景用Token、OAuth2或LDAP集成;权限由服务端控制,如Harbor按项目角色、ACR用RAM策略。

镜像仓库的访问认证与权限设置,核心是让 Docker 客户端能被仓库识别、授权,并按角色控制操作范围。不是所有仓库都用“账号密码”登录,不同场景需匹配对应机制。
确认仓库类型和协议要求
先搞清你连的是哪种仓库,它决定了认证方式和配置起点:
- Docker Hub:默认走 https://index.docker.io/v1/,支持用户名+密码,也推荐用 Personal Access Token(PAT)替代密码,更安全可限权
- Harbor 或自建 Registry:必须指定完整地址,如 harbor.example.com 或 registry.internal:5000;默认启用 Basic Auth,但高版本支持 LDAP、OIDC 或 OIDC + SSO 联动
- 阿里云 ACR、腾讯云 TCR、AWS ECR:使用 HTTPS 地域域名(如 registry.cn-shanghai.aliyuncs.com),通常对接云平台 IAM,ECR 还支持 EC2 实例角色免密拉取
- HTTP 私有仓库(仅限内网测试):需在 /etc/docker/daemon.json 中加入
"insecure-registries": ["192.168.1.100:5000"]并重启 Docker,否则会拒绝连接
执行登录并安全保存凭据
登录动作本身生成凭证,Docker 自动存进 ~/.docker/config.json,后续 push/pull 直接复用:
- 交互式登录:
docker login harbor.example.com,按提示输入用户名和密码(或 PAT) - 非交互式(CI/CD 场景):
echo "$PASSWORD" | docker login --username "$USER" --password-stdin harbor.example.com - 禁止写明文密码:
docker login --password mypass registry会在历史命令和进程列表中泄露,务必避免 - 登录成功后,config.json 里会出现类似
"auths": {"harbor.example.com": {"auth": "base64..."}}的条目
适配企业级认证机制
单纯账号密码不够用时,需配合仓库后端能力做对接:
- Token 认证:Docker Hub 的 PAT、Harbor 的 robot account、ACR 的 AccessKey 都属于这类,本质是带过期时间与权限范围的临时密钥
- OAuth2 / OIDC:Harbor 2.0+、ECR 支持通过 GitHub、GitLab 或企业 IdP 登录,一次认证自动换取短期 JWT
- IAM 角色绑定(云环境):EC2 实例或 Kubernetes Pod 绑定角色后,
docker pull由底层 credential provider 自动注入 token,无需显式 login - LDAP/AD 集成:Harbor 和 Nexus 可对接企业目录服务,用户用域账号登录,权限映射到项目级别
权限控制要落在仓库端
Docker 客户端只管“能不能连”,真正的读写权限由仓库服务端定义:
- Harbor:按“项目(Project)”划分,可设公开/私有,再为用户或机器人账号分配“访客、开发者、维护者、管理员”角色
- ACR:通过 RAM 策略控制 Registry 级别权限,比如
acr:PullRepository或acr:PushRepository - 自建 Registry:原生不带 RBAC,需前置 Nginx 做 Basic Auth + 路径路由,或改用 Harbor/Nexus 替代
- 验证权限是否生效:用
docker pull测试只读,docker push测试写入,失败时看错误码(401=未认证,403=权限不足)


















