Почему docker не запускает приложение flask на 0.0.0.0?

#docker

Вопрос:

Я пытаюсь докеризировать свое приложение flask. Я вижу, что докер будет размещаться на 0.0.0.0. Но я этого не понимаю. Мой док-файл:

 #!/bin/bash
FROM python:3.8
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
#ENTRYPOINT [ "./main_class.py" ]
#CMD [ "flask", "run", "-h", "0.0.0.0", "-p", "5000" ]
CMD [ "python", "main_class.py", "flask", "run", "-h", "0.0.0.0", "-p", "5000" ]
 

Когда я его создаю , он успешно строится. Когда я запустил его docker run -p 5000:5000 iris , он работал успешно. Там написано Running on http://172.17.0.2:5000/ (Press CTRL C to quit) .
Более того, когда я вижу 172.17.0.2:5000 в браузере, это не работает. Но если я использую 127.0.0.1:5000 его, это сработает. Как я могу принести 0.0.0.0:5000 ? В main_class.py я использую

 if __name__ == '__main__':
    app.run(debug=True, threaded=True, host="0.0.0.0")
 

Когда я печатаю docker ps

 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
90a8a1ee3625   iris      "python main_class.p…"   23 minutes ago   Up 21 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   thirsty_lalande
 

Есть ли что-то неправильное, что я делаю в dockerfile ?

Более того , когда я использую ENTRYPOINT , он показывает мне ошибку standard_init_linux.go:228: exec user process caused: exec format error , вот почему я не использую ENTRYPOINT .

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

1. 0.0.0.0 не означает, что адрес службы будет 0.0.0.0. Это означает, что служба будет принимать подключения со всех IP-адресов. Из вашего описания кажется, что все работает так, как должно.

2. 0.0.0.0 означает привязку этого порта ко всем сетевым интерфейсам, включая тот, который обрабатывает общедоступные соединения.

3. Спасибо за информацию. Я думал, что 0.0.0.0-это реальный IP-адрес. Но можете ли вы объяснить , что, когда я набрал 172.17.0.2:5000 в браузере, он не работает, хотя там написано, что он работает на 172.17.0.2:5000. Но если я перейду на localhost:5000, он работает

Ответ №1:

Он flask run -h 0.0.0.0 сообщит вашему процессу flask о привязке к любому локальному IP-адресу, как указано в комментариях. Это также позволит flask отвечать на переадресацию портов Docker (5000->5000), т. е. отвечать на входящий трафик с моста Docker.

На уровне докера ваша эффективная переадресация портов 0.0.0.0:5000->5000/tcp соответствует показаниям docker ps, поэтому в вашей хост-системе порт 5000 на любом локальном IP-адресе будет перенаправлен в процесс колбы вашего контейнера.

Пожалуйста, имейте в виду, что 0.0.0.0 это не настоящий IP-адрес, а заполнитель для привязки к любому локальному IP-адресу.

Вы можете получить доступ к своему приложению flask по любому IP-адресу, который направляется в вашу хост-систему, порт 5000.

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

1. Спасибо за информацию. Я думал, что 0.0.0.0-это реальный IP-адрес. Но можете ли вы объяснить , что, когда я набрал 172.17.0.2:5000 в браузере, он не работает, хотя там написано, что он работает на 172.17.0.2:5000. Но если я перейду на localhost:5000, он работает