我正在使用Sonatype Nexus作为私有Docker注册表。
虽然它适用于经过身份验证的用户,但尝试使用匿名用户拉取图像不起作用。这只发生在 docker 客户端上。
使用Nexus UI(未登录),我可以浏览存储库中的图像。但是尝试提取图像时出现"未经授权"错误。
以下是 Docker 客户端和 Nexus 存储库之间的通信捕获流:
Wireshark 数据包捕获
这很奇怪,因为启用了匿名访问,并且根据文档,我可能有一个 Docker 托管注册表(通过HTTPs
端口RW
访问)和一个 Docker 组注册表,指向 Docker 托管注册表,具有RO/Anonymous
访问权限。
此功能是在 Nexus 3.6 中添加的。根据文档:
- 在"安全>领域"下,启用"Docker 持有者令牌领域"
- 取消选中存储库配置中的"强制基本身份验证"
Nexus让我相当头疼,直到我找到一个相当晦涩的声纳型帖子声明不更改匿名领域。
因此,我遵循的步骤使其正常工作:(在Nexus 3.19.1至3.38.1中进行了测试)
-
与@andrewdotn的答案相同(启用 Docker 持有者令牌"安全>领域"部分中的领域)
-
为本地授权领域启用匿名访问(如上述链接所述)
-
创建 docker(代理)存储库(在本例中为代理 hub.docker.com)
3.1. 启用 HTTP/HTTPS 端点(取决于您是 SSL 连接到结点还是使用反向代理)
3.2. 启用"允许匿名 docker 拉取(需要 Docker 持有者令牌领域)"
3.3. 输入"https://registry-1.docker.io"作为"远程仓库的位置"(对于 docker-hub)
3.4. 将"Docker 索引"设置为使用 Docker Hub 索引(又名:"使用 Docker Hub")
3.5. 保存
- 确保您的匿名用户有权读取新存储库(默认的匿名角色将允许对更多内容进行读取访问,但应该已经允许匿名拉取)
4.1. (可选)如果你想尽可能地限制匿名用户(即:只允许 docker 拉取),请创建一个角色"nx-docker_read"(或类似)并赋予它"nx-repository-view-docker--read"*。(这将允许组中的任何用户从任何 docker 存储库中提取映像,这允许匿名拉取,但在 web-UI 上看不到任何内容)
4.2. (如果你做了 4.1)现在剩下的就是将 Anon 用户的组更改为您的新角色(在我的示例中为"NX-docker_read"),并将其从"nx-anonymous"中删除 => 匿名用户不能再在 Web-UI 上眉毛连结,但仍然可以拉取图像
Docker Registry API 需要身份验证才能访问注册表,即使是拉取操作也是如此。Dockerhub始终需要访问令牌,即使是拉取。但是你可以从dockerhub匿名拉取的原因是它使用了一个令牌服务器,它会自动向匿名用户提供访问令牌。这种机制目前在Nexus 3.0.1中不可用。也许它将被实施(https://issues.sonatype.org/browse/NEXUS-10813)。
因此,目前使用 Nexus 3,它始终需要在拉取图像之前登录(最终匿名用户是您的权限以这种方式设置的)。