无法登录Nexus3 Docker仓库:/v2路径返回404错误
问题描述
执行命令 docker login https://registry.mysite.online 时返回错误:
Error response from daemon: login attempt to https://registry.mysite.online/v2/ failed with status: 404 Not Found
已在Nexus中添加Docker托管仓库(未指定端口),Nexus部署在Nginx反向代理后,当前Helm仓库可正常使用(排除TLS问题)。尝试过为5000端口单独配置server规则、为仓库设置443 HTTPS端口,均仍返回相同404错误。
Nginx代理配置如下:
http { client_body_buffer_size 32k; client_header_buffer_size 8k; large_client_header_buffers 8 64k; proxy_send_timeout 120; proxy_read_timeout 300; proxy_buffering off; tcp_nodelay on; ssl_certificate /etc/letsencrypt/live/mysite.online/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mysite.online/privkey.pem; ssl_dhparam /usr/lib/python3/dist-packages/certbot/ssl-dhparams.pem; client_max_body_size 1G; sendfile on; tcp_nopush on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; server { server_name registry.mysite.online; listen *:443 ssl; location / { proxy_pass http://localhost:8081/; proxy_redirect off; 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-Host $server_name; proxy_set_header X-Forwarded-Proto $scheme; } } }
解决方案
1. 修正Nginx反向代理路径映射
Docker客户端默认请求/v2/端点,但当前Nginx将所有请求转发到Nexus根目录/,而Nexus的Docker仓库需要通过仓库专属路径访问。需调整Nginx配置,将Docker API请求转发到对应仓库的路径:
替换原server块为以下内容(注意将docker-hosted替换为你实际的Nexus Docker托管仓库名称):
server { server_name registry.mysite.online; listen *:443 ssl; # 处理Docker V2 API请求 location /v2/ { proxy_pass http://localhost:8081/repository/docker-hosted/v2/; proxy_redirect off; 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-Host $server_name; proxy_set_header X-Forwarded-Proto $scheme; # 适配Docker长连接需求 proxy_http_version 1.1; proxy_set_header Connection ""; } # 兼容Docker V1登录请求(按需开启) location /v1/ { proxy_pass http://localhost:8081/repository/docker-hosted/v1/; proxy_redirect off; 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-Host $server_name; proxy_set_header X-Forwarded-Proto $scheme; } }
2. 确认Nexus Docker仓库配置
- 登录Nexus管理界面,进入目标Docker托管仓库的配置页。
- 确保仓库的
Repository Path设置正确(默认格式为/repository/<仓库名称>/)。 - 若使用旧版Docker客户端,开启
Allow Docker V1 API选项。 - 无需为仓库单独配置端口(路径式访问模式下,端口由Nginx统一处理)。
3. 验证配置
- 重启Nginx使配置生效:
sudo systemctl restart nginx - 重新执行登录命令:
docker login https://registry.mysite.online - 若问题仍存在,检查Nexus访问日志(
/opt/sonatype/nexus/sonatype-work/nexus3/log/access.log)与Nginx日志,确认请求是否正确到达目标仓库路径。
内容的提问来源于stack exchange,提问作者Emma Rein
相关产品推荐
相关产品推荐

