Задать вопрос
@Karrammbbaa

Как настроить проксирование запросов к докер контейнеру через nginx?

Суть проблемы:
При запуске fastapi приложения без докер контейнера, все работает норм - nginx успешно перенаправляет запросы в запущенную через uvicorn приложуху, запросы корректно обрабатываются. Если я запускаю это приложение через докер контейнер - nginx возвращает ошибку 502.

Логи докер контейнера пустые.
В логах nginx:
[error] 539740#539740: *9485 recv() failed (104: Unknown error) while reading response header from upstream, client: 140.82.115.168, server: myhost.ru, request: "POST /test HTTP/1.1", upstream: "http://127.0.0.1:8001/test", host: "myhost.ru"


Настройки nginx:
server {
        listen 80;
        listen [::]:80;

        server_name myhost.ru www.myhost.ru;
        
        location /test {
                proxy_pass http://127.0.0.1:8001;
        }
}


Dockerfile:
FROM python:3.11-alpine

WORKDIR /app

ENV PYTHONUNBUFFERED 1

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY src/main.py .

CMD ["uvicorn", "main:app", "--port", "8001"]


Сборка образа:
docker build --network=host -t my_test_app .
(Использую '--network=host' потому что без него либы не грузяться с pypi, тоже не понятно почему...)

Запуск контейнера:
docker run -d --rm -p 8001:8001 my_test_app
Если я запускаю контейнер такой командой, то в логах контейнера пусто, в логах nginx 502 bad gateway.
Порт вроде пробросил к контейнеру правильно, видимо нужно еще что-то куда-то дописать...

Я попробовал запустить контейнер так:
docker run -d --rm --network host my_test_app
С флагом '--network host' все работает корректно. Но пишут в интернетах что так лучше не делать.

Что я не так сделал?
  • Вопрос задан
  • 185 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Запускайте оба контейнера через docker-compose в одной сети - тогда выставлять наружу 8001 порт не придётся, а nginx сможет ходить к приложению по имени контейнера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы