Как мне проксировать контейнер docker с запущенным на хосте nginx?

#docker #nginx #reverse-proxy

#docker #nginx #обратный прокси

Вопрос:

Редактировать: целью этого было разрешить только UDP-соединения с определенным портом, который использовал определенный поддомен. Теперь я узнал, что udp не имеет понятия поддоменов, что делает весь этот вопрос бессмысленным.

У меня есть nginx, запущенный на хосте, и программа, которую я хочу проксировать, запущенная в контейнере docker. Как мне настроить nginx для перенаправления трафика с определенного поддомена на этот контейнер? Я не могу найти никаких примеров для этой настройки, только оба на хосте или оба в контейнерах docker. Я уже использовал proxy_pass раньше, но только для обоих на хосте. Кроме того, я бы предпочел не публиковать IP-адрес из контейнера docker на хост; Я бы предпочел, чтобы nginx выполнял пересылку.

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

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

2. Сохраняют ли контейнеры docker свой IP-адрес при перезапуске? Я знаю, как получить IP-адрес из командной строки, но не динамически из конфигурации nginx. Я использую nginx на хосте, потому что я уже настроил его для другого проекта, и я бы предпочел повторно использовать свою существующую конфигурацию, если это возможно. Настройка контейнера nginx — это последний вариант, который я хочу использовать.

3. Я думаю, что любое решение, основанное на IP-адресе контейнера, является ошибочным. Даже если контейнер сохраняет свой IP-адрес при перезапуске , вы будете создавать новые контейнеры при обновлении конфигурации или пакета.

4. Вы должны обращаться с вашим контейнерным процессом так же, как с nginx или любым другим процессом на хосте. Используйте docker run -p , чтобы получить порт для него, видимый с хоста, а затем proxy_pass к нему.

5. Я пытался использовать nginx, чтобы сделать один udp-порт доступным только для определенного поддомена. Оказывается, UDP не имеет понятия о поддоменах, что делает все это бессмысленным. Я просто буду использовать docker run -p PORT:PORT , как раньше, и назову это днем. Спасибо, что прокомментировали мой вопрос.

Ответ №1:

Эта конфигурация должна работать:

 server {
    listen       80;
    server_name  subdomain.domain.tld;
    location / {
        proxy_pass http://<IP of Docker Container>:<port>;
    }
}
  

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

1. Как мне получить IP-адрес контейнера docker во время выполнения? Кроме того, трафик является UDP, поэтому я не могу использовать префикс http.

2. Вы не можете получить IP-адрес контейнера, не имея привилегий корневого уровня, и он может фактически измениться во время очень рутинных операций обслуживания контейнера.

Ответ №2:

В ответ на @IHuman я бы перенаправил порт контейнера docker на порты на хосте. При этом nginx, работающий на хосте, будет иметь все местоположения, относящиеся к IP-адресу обратной связи

 server {
    listen       80;
    server_name  subdomain.domain.tld;
    location / {
        proxy_pass http://127.0.0.1:<port1>;
    }
}