Docker Nginx proxy_pass-上游连接被拒绝

时间:2018-08-22 13:08:07

标签: docker nginx docker-compose reverse-proxy nginx-reverse-proxy

我已经使用Nginx启动了一个简单的Docker容器,我想将此Docker Nginx用作主机上应用程序(HTTP Tomcat)的反向代理。但是我的proxy_pass只能使用意外的IP值。

预期的行为:当我在容器上使用docker inspect时,我的 Gateway 172.29.0.1,我的proxy_pass应该可以使用172.29.0.1

当前:我必须在172.18.0.1中使用proxy_pass才能使其正常工作,并且我不明白为什么这个随机值会起作用 >。如果我不使用172.18.0.1,那么我会遇到5​​02 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,但是在手动将其设置为{{ 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使用以下IP时,反向代理才有效:{ {1}}。

注意:

  • 我的Docker版本:18.06.1-ce
  • 我的docker-compose版本:1.22.0
  • 我的操作系统:Ubuntu 18.04 LTS
  • 我不在主机上使用PHP,我有一个Tomcat服务器侦听端口号8000。
  • proxy_pass172.19.0.1仅在Windows和Mac下可用,这就是为什么我使用host.docker.internal(在我的Nginx文件中)的原因,这是 docker自动设置的网关值-撰写

问题:

  1. 我的错误在哪里?
  2. 要使其正常运行,我需要更改什么?

谢谢

1 个答案:

答案 0 :(得分:1)

docker-compose 在每次部署时自动创建一个新网络。 通过使用 docker-compose 文件中的network_mode: bridge选项,可以固定网关IP地址。通过此解决方案,您将使用Docker的默认网络( docker0 )。

如果您使用network_mode: bridge选项,将无法像我在原始示例中那样使用upstream中的Docker服务名称:

upstream upstream-nginx-web {
  # "nginx-web" is NOT recognized if "network_mode: bridge"
  server nginx-web:8000;

  # Use your Docker Gateway (which can be 172.17.0.1)
  server 172.17.0.1:8000;
}

您可以使用以下docker命令找到您的Docker网关:

docker network inspect bridge --format="{{ (index .IPAM.Config 0).Gateway }}"

结果:

172.17.0.1