我正在尝试在 docker 内设置一个 nginx 代理,该代理将侦听网络流量,然后基于虚拟主机将流量转发到也在 docker 容器内运行的不同 jenkins 实例。为了编排这个,我使用 docker-compose。
我设法:
- 启动 jenkins 实例并直接与它们对话
- 启动 nginx 并将其配置为充当在另一台主机上运行的网络服务器的代理
但是,当我尝试让 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://server_jenkins:8081
- http://172.18.0.3:8081 (使用 --x-networking 运行时分配给 server_jenkins 的 IP 号)
使用 --x-networking 运行时,我将链接语句更改为 docker-compose.yml 中的 container_name
版本:
- 码头工人:1.9.1,构建a34a1d5
- 码头工人撰写:1.5.2,构建7240ff3
- 操作系统:Debian 8(在 Virtualbox 中运行)
我正在删除我之前的答案,因为我在回答完全不同的问题。我发现你的问题,它的
http://127.0.0.1
和端口是错误的,127.0.0.1
在 nginx 的 conf 中意味着httpd
容器本身在这种情况下不是主机。如果您将其重新定义为
server_jenkins
并为这两个端口添加clients_jenkins
后缀8080
,那么它应该可以工作。另外,我注意到 http 指令会导致错误,但正如您提到的,您提供的文件可能只是一个片段。
发现了问题。我对端口映射的工作方式感到困惑。
工作配置:docker-compose.yml:
nginx.conf:
IE。无需映射端口。