Docker 容器内的 Nginx 无法与其他容器通信(运行 jenkins)

Docker 容器内的 Nginx 无法与其他容器通信(运行 jenkins)

我正在尝试在 docker 中设置一个 nginx 代理,它将监听 web 流量,然后基于虚拟主机将流量转发到也在 docker 容器内运行的不同 jenkins 实例。为了协调这一点,我使用了 docker-compose。

我已成功:

  • 启动 Jenkins 实例并直接与其对话
  • 启动 nginx 并将其配置为另一台主机上运行的 Web 服务器的代理

但是当我尝试让 nginx 服务器路由 docker 内部的流量时,我无法让它工作,只会收到 502-Bag Gateway 错误,并且 nginx 日志中会出现以下内容:

[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "localhost:8080"

我的docker-compose.yml的相关部分:

httpd:
  build: httpd
  ports:
      - "8080:8080"
  links:
      - "server_jenkins"
      - "clients_jenkins"
  restart: always

server_jenkins:
  image: jenkins
  ports:
      - "8081:8080"
  restart: always

clients_jenkins:
  image: jenkins
  ports:
      - "8082:8080"
  restart: always

httpd/Dockerfile 如下所示:

FROM nginx
RUN rm -rf /etc/nginx
COPY config /etc/nginx/

nginx.conf 的相关部分如下所示(仅代理一个 jenkins 实例):

http {
    server {
        listen       8080;
        server_name server.build.example.com;
        root /tmp;

        location / {
            proxy_pass   http://127.0.0.1:8081;
        }
    }
    server {
        listen       8080;
        server_name clients.build.example.com;
        root /tmp;

        location / {
            proxy_pass   http://127.0.0.1:8082;
        }
    }
}

我尝试过第一个 proxy_pass url 的以下变体(还有一些我不记得了):

使用 --x-networking 运行时,我将 docker-compose.yml 中的链接语句更改为 container_name

版本:

  • docker:1.9.1,构建a34a1d5
  • docker-compose:1.5.2,构建 7240ff3
  • 操作系统:Debian 8(在 Virtualbox 中运行)

答案1

我正在删除我之前的答案,因为我正在回答完全不同的事情。我发现你的问题,它的http://127.0.0.1和端口是错误的,127.0.0.1在 nginx 的 conf 中,httpd在这种情况下意味着容器本身,而不是主机。

如果您将其重新定义为server_jenkins和,clients_jenkins8080为这两个端口添加后缀,那么它应该可以工作。

server {
    listen       8080;
    server_name server.build.example.com;
    root /tmp;

    location / {
        proxy_pass   http://server_jenkins:8080;
    }
}
server {
    listen       8080;
    server_name clients.build.example.com;
    root /tmp;

    location / {
        proxy_pass   http://clients_jenkins:8080;
    }
}

另外,我注意到 http 指令会导致错误,但正如您所提到的,您提供的文件可能只是一个片段。

答案2

找到问题了。我对端口映射的工作原理感到困惑。

工作配置:docker-compose.yml:

httpd:
  build: httpd
  ports:
      - "8080:8080"
  links:
      - "server_jenkins"
      - "clients_jenkins"
  restart: always

server_jenkins:
  image: jenkins
  restart: always

clients_jenkins:
  image: jenkins
  restart: always

nginx.conf:

http {
    server {
        listen       8080;
        server_name server.build.example.com;
        root /tmp;

        location / {
            proxy_pass   http://server_jenkins:8080;
        }
    }
    server {
        listen       8080;
        server_name clients.build.example.com;
        root /tmp;

        location / {
            proxy_pass   http://client_jenkins:8080;
        }
    }
}

即,无需映射端口。

相关内容