docker-compose с помощью nginx не может подключиться к приложению localhost

#nginx #docker-compose

#nginx #docker-compose

Вопрос:

Я запускаю nodejs на localhost, в то время как nginx работает как контейнер docker с помощью docker-compose

Я не могу установить какие-либо подключения к приложению node js:

nginx.conf

 worker_processes  1;
events {
    worker_connections  1024;
}
http {
    server {
        listen 80;
        server_name licensing.cluster-ops.co;
        location / {
                proxy_pass http://md_license_server:3005;
                proxy_set_header Host $host;
        }
    }
}

 

docker-compose.yml

 version: "3.3"
services:
  md_license_server:
   image: root/md-license-server
   expose:
    - 3005
   ports:
    - 3005:3005
  nginx:
   image: nginx:latest
   container_name: nginx
   ports:
    - 80:80
    - 443:443
   volumes:
    - /etc/ssl/certs:/etc/ssl/certs
    - /etc/ssl/private:/etc/ssl/private
    - /root/docker/nginx.conf:/etc/nginx/nginx.conf


 

Я перепробовал там все.

extra_hosts: — «host.docker.internal: 127.0.0.1»

^ это не сработает.

Приложение узла отлично работает на localhost.. Я попытался выполнить некоторые вызовы curl, и ответ был в порядке.

Это сообщение об ошибке, которое я получаю от docker:

 2021/12/06 14:29:06 [error] 24#24: *3 connect() failed (111: Connection refused) 
while connecting to upstream, client: 139.59.147.204, server: 
localhost, request: "GET /ping HTTP/1.1", upstream: "http://172.19.0.2:3005
/ping", host:...
 

Похоже, что «172.19.0.2:3005» — это либо IP-адрес службы md_license.

Выполняется

docker-compose exec md_license_server curl http://localhost:3005/ping возвращает true

это означает, что сервер узла работает внутри контейнера.


Я чувствую, что это что-то о nginx.

Ответ №1:

Скорее всего, у вас есть перекрытие диапазона IP между сетью docker и хост-сетью. Но давайте не будем предполагать, что сейчас :


  • Если вы используете Docker для рабочего стола (Windows, Mac), нет необходимости добавлять дополнительные хосты. Напрямую:
     upstream backend {
      server host.docker.internal:3005;
    }
     
  • Если вы НЕ используете Docker для рабочего стола (Linux), вам необходимо проверить частный IP-адрес вашего хоста hostname -i , а затем указать этот частный IP-адрес в конфигурации nginx
     # assuming that `hostname -i` prints 192.168.x.y
    upstream backend {
      server 192.168.x.y:3005;
    }
     

Теперь, если вы хотите поместить это динамически, это уже другая тема, но вы можете проверить шаблоны nginx.


Возвращаясь к 1-му предположению: в любом случае, если существует перекрытие между сетью Docker и вашей хост-сетью, маршрутизатор не будет пересылать пакет хосту, и он продолжает находиться внутри сети docker. Итак, давайте проверим:

  • Проверьте IP-адрес вашего хоста : hostname -i
  • Проверьте IP-адрес вашего контейнера Docker : docker-compose exec nginx hostname -i

ЕСЛИ есть перекрытие, вам нужно будет предоставить пользовательскую сеть docker:

 services:
   nginx:
     image: ....
     networks:
       custom-net: # attach nginx container to that network
         ipv4_address: 172.24.0.22 # assign static IP for your container from the network defined below.

networks:
  custom-net: # create new docker network
    ipam:
      config:
       - subnet: 172.24.0.0/24 # with explicit CIDR range
 

Комментарии:

1. я собираюсь попробовать эти изменения конфигурации сейчас. Спасибо

2.docker exec возвращает: nginx -> 172.19.03 license_server -> 172.19.02 . Для хост-машины: hostname -i -> 127.0.1.1

3. кроме того, при выполнении запроса извне он, похоже, указывает на правильный IP: , запрос: «GET / ping HTTP / 1.1», восходящий поток: «http://:3005/ping 172.19.0.3 » сбой подключения () (111: отказано в подключении) о, подождите .. кажется, он указывает на себя.

4. это может быть проблемой с nginx или, может быть, docker перепутывает IP-адреса при каждом перезапуске?

5. Я не могу заставить его работать с вышеуказанным решением; (

Ответ №2:

Это была проблема, вызванная fastify.

Решение можно найти здесь: https://github.com/fastify/fastify/issues/935