#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>;
}
}