Невозможно завершить соединение с сокет-сервером внутри Docker Container, хотя тот же сервер Gunicorn, который не находится в контейнере, работает нормально - PullRequest
1 голос
/ 07 ноября 2019

У меня есть приложение веб-сервера, которое было упаковано с Docker. Когда я проверил веб-сервер с помощью следующей команды:

gunicorn --bind 0.0.0.0:3000 --worker-class eventlet -t 1000 -w 1 wsgi

, мое приложение веб-интерфейса смогло успешно установить соединение через сокет (распечатав в консоли мой код jQuery, что сервер был подключен, и больше не говорилERR_CONNECTION_REFUSED), но когда я запустил приложение в контейнере и запустил в нем ту же команду с

CMD ["gunicorn", "--bind", "0.0.0.0:3000", "--worker-class", "eventlet", "-t", "1000", "-w", "1", "wsgi"],

и с помощью следующей команды для запуска контейнера Docker:

docker run -v $(pwd):/app -p 0.0.0.0:5000:3000 <container_name>

соединение не установлено. Когда я запускаю сервер с этой командой, журналы ERR_CONNECTION_REFUSED перестают появляться, как раньше, но соединение не установлено, и тот же код jQuery для распечатки, что соединение было успешным, никогда не запускается. Интерфейс пытается установить соединение с помощью этого кода JavaScript: var socket = io.connect('http://0.0.0.0:5000'). Я проверяю соединение с помощью:

        socket.on('connect', function(){
            console.log('Backend successfully connected!'); 
        });

При использовании команды gunicorn я получаю сообщение «Backend успешно подключен» на моей консоли, и приложение backend работает как положено, но когда я использую его через докер-контейнер, сообщение не появляется. Если у меня не запущен Docker-контейнер, консоль выдаст сообщение ERR_CONNECTION_REFUSED, поскольку сервер не запущен. Кажется, что прослушивающий сокет распознает, что существует сервер, к которому он может попытаться подключиться, но каким-то образом не может установить соединение.

Я думаю, что есть проблема со значением -p, которое я установил, или с любыми другими аргументами, которые разрешают это соединение. Я попытался запустить контейнер с --privileged, но безрезультатно.

Я новичок в докерах и о том, как работают их порты, так что мое описание происходящего здесь, вероятно, также неверно. Буду признателен за любые отзывы, указатели и исправления любых заблуждений, которые у меня есть.

К вашему сведению, это Dockerfile, который я использовал для создания контейнера:

FROM python:3.6-slim

COPY requirements.txt . 

RUN apt-get update \
    && apt-get install -y --no-install-recommends apt-utils gcc g++\
    && rm -rf /var/lib/apt/lists/* \
    && pip install --upgrade pip \
    && pip install --no-cache-dir -r requirements.txt \
    && apt-get purge -y --auto-remove apt-utils gcc g++

COPY . /app

WORKDIR /app

EXPOSE 3000 
CMD ["gunicorn", "--bind", "0.0.0.0:3000", "--worker-class", "eventlet", "-t", "1000", "-w", "1", "wsgi"]
...