Nginx proxy_pass в связанный контейнер докеров

У меня есть два докерных контейнера с nginx. контейнер1 связан с контейнером2. Затем Docker добавляет запись в /etc/hosts, которую я ввел в конфигурацию nginx, например:

server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://container1/$1;
    }
}

Я могу ping container1 из контейнера2, но nginx не может его решить:

* 1 нет разрешения, разрешенного для разрешения контейнера1

Как я могу проксировать запрос в другой контейнер докеров?

Ответы

Ответ 1

Вы должны взглянуть на этот ответ об использовании /etc/hosts в качестве вашего распознавателя: Использование /etc/hosts в качестве resolver для перезаписи URL

В основном, ваши DNS или resolver не используют /etc/hosts для разрешения имен во время поиска, но вы можете обойти это, установив dnsmasq и используя 127.0.0.1 в качестве вашего распознавателя. Вы можете добавить 127.0.0.1 в качестве преобразователя непосредственно в конфигурацию nginx:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.1;
        proxy_pass http://container1/$1;
    }
}

Ответ 2

Используйте непосредственно восходящий блок вместо имени контейнера

upstream backend {
    server container1;
}
server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://backend/$1;
    }
}

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

Ответ 3

Вы можете использовать встроенную службу DNS Docker, если она включена, проверьте свой преобразователь контейнера:

cat /etc/resolv.conf

Должно быть:

nameserver 127.0.0.11

Использовать этот IP как распознаватель:

server {
    location ~ ^/some_url/(.*)$ {
        resolver 127.0.0.11;
        proxy_pass http://container1/$1;
    } }