You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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互通。

具体修复步骤

  1. 使用容器名称作为上游地址(推荐)

    • 启动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容器生效。
  2. 使用宿主机内网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
      
  3. 验证连通性

    • 进入Nginx容器,ping Registry容器的名称或IP,确认网络可达:
      docker exec -it <nginx容器名称> ping docker-registry
      

额外检查项

  • 确认服务器防火墙/安全组已开放80、443端口,允许外部流量进入
  • 用docker ps检查Registry和Nginx容器是否正常运行
  • 若修改配置后仍有问题,查看Nginx容器内的错误日志:docker exec -it <nginx容器名称> cat /var/log/nginx/docker-error.log

内容的提问来源于stack exchange,提问作者Ranndom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:05:08