在非根路径上服务 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/
配置(用于登录的配置)很重要,否则将永远无法访问。
我不确定有关授权的所有要求是否都按预期工作...如果我发现任何问题,我会更新此答案。
我们有几个 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/
配置(用于登录的配置)很重要,否则将永远无法访问。
我不确定有关授权的所有要求是否都按预期工作...如果我发现任何问题,我会更新此答案。