Docker nginx proxy_pass — восходящее соединение отклонено

Я запустил простой контейнер Docker с Nginx, я хочу использовать этот Docker Nginx в качестве обратного прокси-сервера для моего приложения (HTTP Tomcat) на моем хосте. Но мой proxy_pass работает только с неожиданным значением IP.

Ожидаемое поведение. Когда я использую docker inspect в своем контейнере, мой шлюз172.29.0.1, мой proxy_pass должен работать с 172.29.0.1.

Текущий: я должен использовать 172.18.0.1 в своем proxy_pass, чтобы заставить его работать, и я не понимаю, почему это случайное значение работает. Если я не использую 172.18.0.1, у меня возникает ошибка HTTP 502, а в моих журналах докеров отображается сообщение «В восходящем соединении отказано».

Мой 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.

Заметки:

  • Моя версия докера: 18.06.1-ce
  • Моя версия для создания докеров: 1.22.0
  • Моя ОС: Ubuntu 18.04 LTS
  • Я не использую PHP на своем хосте, у меня есть порт прослушивания сервера Tomcat с номером 8000.
  • host.docker.internal и gateway.host.internal доступны только в Windows и Mac, поэтому я использую nginx-web (в моем файле Nginx), который является значением Gateway, автоматически устанавливаемым docker-compose.

Вопросы:

  1. Где моя ошибка?
  2. Что мне нужно изменить, чтобы заставить его работать и почему?

Спасибо


person Gugelhupf    schedule 22.08.2018    source источник
comment
Docker Compose автоматически создаст частную сеть Docker для каждого развертывания, и я уверен, что именно поэтому вы не видите IP-адрес моста по умолчанию. Будет ли работать один из других IP-адресов вашего хоста (например, 10.110.20.76)?   -  person David Maze    schedule 22.08.2018
comment
Да, ваше решение с 10.110.20.76 работает, но я его использовать не буду. Ваш ответ помог мне найти решение другим способом: заставить docker-compose использовать сеть Docker по умолчанию (docker0), чтобы исправить IP-адрес шлюза.   -  person Gugelhupf    schedule 22.08.2018


Ответы (1)


docker-compose автоматически создает новую сеть при каждом развертывании. Можно исправить IP-адрес шлюза, используя параметр network_mode: bridge в файле docker-compose. В этом решении вы будете использовать сеть Docker по умолчанию (docker0).

Если вы используете опцию network_mode: bridge, вы не сможете использовать имя службы Docker в upstream, как это было в моем исходном примере:

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
person Gugelhupf    schedule 22.08.2018
comment
ты только что спас мне жизнь - person cancelajavi; 23.03.2019