#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, он работает