Docker Registry+Nginx容器反向代理502错误排查求助
问题:Docker Registry + Nginx容器部署后外部访问502错误
- 服务器上Docker Registry和Nginx均以容器部署,静态文件、SSL配置均验证有效
- 服务器本地curl访问Registry正常(监听
http://*:5000),但外部通过Postman/浏览器访问返回502错误
错误日志
2024/09/21 18:14:50 [error] 19#19: *34 no live upstreams while connecting to upstream, client: IP, server: docker.myDomain.org, request: "GET /v2/ HTTP/1.1", upstream: "http://localhost/v2/", host: "docker.myDomain.org" 2024/09/21 18:15:17 [error] 19#19: *35 connect() failed (111: Connection refused) while connecting to upstream, client: IP, server: docker.myDomain.org, request: "GET /.git/config HTTP/1.1", upstream: "http://127.0.0.1:5000/.git/config", host: "213.165.94.168"
Nginx配置文件(docker.conf)
server { listen 443 ssl; server_name docker.myDomain.org; ssl_certificate /etc/nginx/ssl/myDomain.org.cer; ssl_certificate_key /etc/nginx/ssl/myDomain.org.key; location / { # Do not allow connections from docker 1.5 and earlier # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { return 404; } proxy_pass http://localhost:5000; 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_read_timeout 900; } access_log /var/log/nginx/docker-access.log; error_log /var/log/nginx/docker-error.log; } server { listen 80; server_name docker.myDomain.org; return 301 https://$host$request_uri; }
排查与解决方法
核心原因
Nginx容器内的localhost:5000指向的是Nginx容器自身,而非宿主机上的Registry容器——这是Docker容器网络隔离特性导致的,两个容器默认不在同一网络命名空间,无法通过localhost互通。
具体修复步骤
使用容器名称作为上游地址(推荐)
- 启动Registry容器时指定自定义名称:
docker run -d --name docker-registry registry:2 - 创建自定义Docker网络,让两个容器加入同一网络:
docker network create registry-net docker network connect registry-net docker-registry docker network connect registry-net <你的nginx容器名称> - 修改Nginx配置中的
proxy_pass为http://docker-registry:5000,重启Nginx容器生效。
- 启动Registry容器时指定自定义名称:
使用宿主机内网IP作为上游地址
- 找到宿主机的内网IP(如
192.168.1.100,可通过ip a命令查看) - 修改Nginx配置中的
proxy_pass为http://192.168.1.100:5000 - 确保Registry容器启动时绑定到0.0.0.0(而非仅127.0.0.1):
docker run -d -p 0.0.0.0:5000:5000 registry:2
- 找到宿主机的内网IP(如
验证连通性
- 进入Nginx容器,ping Registry容器的名称或IP,确认网络可达:
docker exec -it <nginx容器名称> ping docker-registry
- 进入Nginx容器,ping Registry容器的名称或IP,确认网络可达:
额外检查项
- 确认服务器防火墙/安全组已开放80、443端口,允许外部流量进入
- 用
docker ps检查Registry和Nginx容器是否正常运行 - 若修改配置后仍有问题,查看Nginx容器内的错误日志:
docker exec -it <nginx容器名称> cat /var/log/nginx/docker-error.log
内容的提问来源于stack exchange,提问作者Ranndom
相关产品推荐
相关产品推荐

