需先在 Nexus 管理界面创建 Docker 仓库并绑定 HTTP/HTTPS 端点,启用 Docker Bearer Token Realm,配置正确权限与仓库 URL,确保反代透传关键请求头,升级至 Nexus 3.39.0+ 并检查日志定位协议解析问题。

怎么让 Nexus 3 正确暴露 Docker 镜像仓库端口
Nexus 3 默认不开启 Docker 仓库支持,直接用 docker run -p 5000:5000 启动是无效的——它根本没监听那个端口,更不会处理 docker push 请求。
必须先在 Nexus 管理界面里创建一个 Docker 类型的仓库(docker (hosted) 或 docker (proxy)),再绑定到一个 HTTP/HTTPS 端点。Nexus 不是“启动即服务”,它是“配好才可用”。
- 宿主机端口(如
8083)要映射到 Nexus 容器内8081(默认 Web 端口),不是映射到 Docker Registry 的逻辑端口 - Docker 仓库实际走的是 Nexus 的反向代理路径,比如
http://nexus-host:8083/repository/docker-internal/,不是独立进程 - 如果启用了 HTTPS,客户端
docker login必须用域名访问,且该域名需与 Nexus 配置的application-port-ssl或反代证书 Subject 匹配,否则报unauthorized: authentication required
为什么 docker login 总提示 no basic auth credentials
这不是 Docker 客户端问题,是 Nexus 的 Realm 配置缺失或认证方式不匹配。Nexus 3 的 Docker 仓库默认不启用 docker-bearer-token-realm,而现代 Docker CLI 强制要求 Bearer Token 认证。
- 进 Nexus 系统设置 → Realms,把
Docker Bearer Token Realm拖到“Active realms”列表顶部 - 确保对应 Docker 仓库的“Configuration”页中,“HTTP”选项卡下勾选了
Enable Docker V1 API(仅当需要兼容极老客户端时),但绝大多数情况应**取消勾选**,避免触发错误的认证回退 - 如果用 Nginx 做前置反代,必须透传
Authorization和X-Forwarded-Proto头,否则 Nexus 拿不到原始 token 信息
push 镜像时报 denied: requested access to the resource is denied
这是权限粒度问题:Nexus 的 Docker 仓库权限(nx-repository-view-docker-*)和用户角色必须精确匹配,光有 nx-admin 不够,它不自动继承仓库级操作权限。
- 检查用户是否被赋予了针对该仓库的
nx-repository-view-docker-internal-read+nx-repository-view-docker-internal-add(push 需要 add,不是 write) - 镜像 tag 必须符合仓库配置的“Deployment policy”:如果仓库设为
Disable redeploy,重复 push 同一 tag 会直接拒收,报错就是这个提示 - 客户端执行
docker tag时,前缀必须和 Nexus 中仓库的“Repository URL”完全一致,包括协议、端口、路径,少一个斜杠都可能 403
Nexus 作为 Docker proxy 缓存镜像时拉取失败怎么办
proxy 类型仓库依赖上游源连通性与响应格式,Docker Hub 的 v2 API 返回头或重定向行为变更常导致 Nexus 解析失败,表现为 500 Server Error 或空响应。
- 确认 Nexus 版本 ≥ 3.39.0,旧版对 Docker Hub 新 API 兼容差;升级后清空
blobstores下对应 proxy 的缓存目录 - 在 proxy 仓库配置中,“Remote storage” URL 必须是
https://registry-1.docker.io,不能写https://hub.docker.com或省略-1 - 若上游返回 429(rate limit),Nexus 默认不透传 Retry-After,此时需在 Nexus JVM 启动参数加
-Dnexus.docker.proxy.retry=true并重启
真正卡住的地方往往不是配置项本身,而是 Nexus 对 Docker 协议的理解深度——它不运行 registry 进程,所有请求都经由自己解析、改写、转发。任何一步 header 丢失、token 解包失败、路径 normalize 错误,都会变成一句模糊的 denied 或 unauthorized。调问题得盯着 Nexus 日志里的 o.s.s.w.a.ExceptionTranslationFilter 和 o.n.r.r.d.p.DockerProxyHandler 这两行。










