在非根路径上服务 docker 存储库(nginx + Sonatype Nexus)

Serve docker repository on non-root path (nginx + Sonatype Nexus)

我们有几个 Docker 存储库,由 Sonatype Nexus 服务器提供。

问题是我们想从路径为它们提供服务,而不是在不同的域上为它们提供服务。原因很简单:配置新路径比配置新域更容易,每个子域都有注册和 SSL 证书。此外,还有一些安全问题。

可以做到吗?

一段时间后,我发现有两个步骤:登录和正常使用。

由于安装有 nginx 和 docker-compose 中的 nexus 服务器,我可以将 nexus 主机称为 "nexus",并仅通过 http 访问。使用 the usual nginx configuration

在 nginx 中解析 SSL 证书

为了使登录正常工作,将路径 /v2/ 重定向到 docker 存储库很重要。这可以用 nginx 来完成:

location /v2/ {
   proxy_set_header    Host $host;
   proxy_set_header    X-Real-IP $remote_addr;
   proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header    X-Forwarded-Proto $scheme;
   proxy_pass          http://nexus:10000;
   proxy_read_timeout  90;
}

注意它假定 docker 存储库的 nexus 配置在 10000 端口 (http) 内部侦听。 使用此配置,docker login 应该已经可以工作,但您无法拉取任何图像。

为了访问图像,重写 URI 很重要(请将此配置放在之前显示的 /v2/ 配置之上):

location ~ /v2/repository/docker-repo1/(.*) {
  proxy_set_header    Host $host;
  proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_pass          http://nexus:10000/v2/;
  proxy_read_timeout  90;
}

并且很容易意识到您可以创建第二个存储库,监听端口 10001,配置为:

location ~ /v2/repository/docker-repo2/(.*) {
  proxy_set_header    Host $host;
  proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_pass          http://nexus:10001/v2/;
  proxy_read_timeout  90;
}

完成了。

记住在所有其他配置之后维护 /v2/ 配置(用于登录的配置)很重要,否则将永远无法访问。

我不确定有关授权的所有要求是否都按预期工作...如果我发现任何问题,我会更新此答案。