У меня есть приложение веб-сервера, которое было упаковано с 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"]