Почему я не вижу свое контейнерное приложение docker flask на localhost: 5000?

#python #docker #flask

#python #docker #flask

Вопрос:

Я пытаюсь изучить контейнеры Docker. У меня возникли небольшие проблемы с пониманием того, как получить доступ к localhost самого контейнера, а не к моей машине. Вот мой контейнер docker while_loop: 1.5 запущен.

  Name-3:~ Name$ docker run while_loop:1.5
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL C to quit)
  

После выполнения docker ps команды для получения любой информации о запущенном контейнере отображается правильный запущенный контейнер:

 CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
19795c23a73d        while_loop:1.5      "/bin/sh -c 'python …"   About a minute ago   Up About a minute   5000/tcp            distracted_shamir
  

Мой файл Dockerfile:

 FROM ubuntu:18.04
COPY ./app /home/programs/python/

RUN apt-get update -y amp;amp; 
    apt-get install -y python-pip python-dev

RUN pip install flask

WORKDIR /home/programs/python/
EXPOSE 5000
CMD python /home/programs/python/main.py
  

После тестирования простого приложения flask на моем локальном компьютере оно работает без каких-либо проблем. Не уверен, как на самом деле настроить таргетинг на контейнер.

main.py в случае необходимости:

 from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0')
  

Ответ №1:

Вы не упомянули, какую команду вы используете для запуска контейнера. Вероятно, вам нужно предоставить флаг -p 5000:5000 для docker run команды.

EXPOSE 5000 Строка в Dockerfile фактически не приводит к открытию этого порта:

РАСКРЫТЬ документы:

EXPOSE Инструкция фактически не публикует порт. Он функционирует как тип документации между человеком, который создает образ, и человеком, который запускает контейнер, о том, какие порты предназначены для публикации. Чтобы фактически опубликовать порт при запуске контейнера, используйте -p флаг на docker run для публикации и сопоставления одного или нескольких портов

Учитывая это, это сбивает с толку, что docker ps на самом деле показывает 5000/tcp . После исправления вы должны увидеть:

 0.0.0.0:5000->5000/tcp
  

где первый порт является открытым портом, а второй — портом в контейнере.