Docker nginx proxy_pass - 上游连接被拒绝

Gug*_*upf 2 reverse-proxy nginx docker docker-compose nginx-reverse-proxy

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

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

当前:我必须使用172.18.0.1myproxy_pass才能使其工作,并且我不明白为什么这个随机值有效。如果我不使用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/
Run Code Online (Sandbox Code Playgroud)

我的nginx 文件(我的nginx-web值是网关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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的主机 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
Run Code Online (Sandbox Code Playgroud)

另一个奇怪的行为:

我已使用 重新启动容器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 文件中)的原因,它是由docker-composenginx-web自动设置的网关值。

问题:

  1. 我的错误在哪里?
  2. 我必须改变什么才能让它发挥作用,为什么?

谢谢

Gug*_*upf 5

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

如果您使用该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;
}
Run Code Online (Sandbox Code Playgroud)

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

docker network inspect bridge --format="{{ (index .IPAM.Config 0).Gateway }}"
Run Code Online (Sandbox Code Playgroud)

结果:

172.17.0.1
Run Code Online (Sandbox Code Playgroud)