【发布时间】:2019-01-28 18:16:53
【问题描述】:
我已经使用 Nginx 启动了一个简单的 Docker 容器,我想使用这个 Docker Nginx 作为我主机上我的应用程序(HTTP Tomcat)的反向代理。但是我的proxy_pass 只适用于意外的 IP 值。
预期行为:当我在容器上使用docker inspect 时,我的网关 是172.29.0.1,我的proxy_pass 应该与172.29.0.1 一起使用。
当前:我必须在我的proxy_pass 中使用172.18.0.1 才能使其工作,并且我不明白为什么这个随机值有效。如果我不使用172.18.0.1,那么我会遇到 502 HTTP 错误,并且我的 docker 日志会显示“上游连接被拒绝”。
我的 Dockerfile(仅包含 1 行):
FROM nginx
我的 docker-compose(我使用 docker-compse up --build 来启动我的容器):
version: '3'
services:
nginx-web:
image: nginx-web
container_name: nginx-web-container
build: .
ports:
- "80:80"
volumes:
- ./volume-sources/nginx-conf-files:/etc/nginx/conf.d/
我的 nginx 文件(我的 nginx-web 值是 Gateway 值,即 172.29.0.1,但手动设置为 172.18.0.1 时有效):
upstream upstream-nginx-web {
server nginx-web:8000;
}
server {
listen 80;
server_name my-site.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://upstream-nginx-web;
}
}
在我的主机ip route:
default via 192.168.1.1 dev wlp2s0
10.0.0.0/8 via 10.110.23.254 dev enp0s31f6
10.110.20.0/22 dev enp0s31f6 proto kernel scope link src 10.110.20.76 metric 100
169.254.0.0/16 dev enp0s31f6 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.29.0.0/16 dev br-56b3c9a632cf proto kernel scope link src 172.29.0.1 linkdown
192.168.1.0/24 dev wlp2s0 proto kernel scope link src 192.168.1.101 metric 600
另一个奇怪的行为:
我已经用docker-compose up --build --force-recreate --always-recreate-deps 重新启动了我的容器,但这次我的网关 是172.17.0.1,但反向代理只有在proxy_pass 使用此IP:172.19.0.1 时才有效。
注意事项:
- 我的 Docker 版本:18.06.1-ce
- 我的 docker-compose 版本:1.22.0
- 我的操作系统:Ubuntu 18.04 LTS
- 我的主机上没有使用 PHP,我有一个 Tomcat 服务器监听端口号 8000。
-
host.docker.internal和gateway.host.internal仅在 Windows 和 Mac 下可用,这就是我使用nginx-web(在我的 Nginx 文件中)的原因,它是 docker-compose 自动设置的网关值。李>
问题:
- 我的错误在哪里?
- 我必须进行哪些更改才能使其正常工作?为什么?
谢谢
【问题讨论】:
-
Docker Compose 会自动为每个部署创建一个 Docker 私有网络,我敢打赌这就是你看不到默认网桥 IP 的原因。您的其他主机 IP 地址之一是否有效(可能是 10.110.20.76)?
-
是的,您使用
10.110.20.76的解决方案有效,但我不会使用它。您的回答帮助我以另一种方式找到了解决方案:使 docker-compose 使用默认 Docker 网络 (docker0) 以修复网关 IP。
标签: docker nginx docker-compose reverse-proxy nginx-reverse-proxy