我正在尝试在 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 的以下变体(还有一些我不记得了):
- http://服务器詹金斯:8081
- http://172.18.0.3:8081 (使用 --x-networking 运行时分配给 server_jenkins 的 ip 号码)
使用 --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_jenkins
并8080
为这两个端口添加后缀,那么它应该可以工作。
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;
}
}
}
即,无需映射端口。