#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
где первый порт является открытым портом, а второй — портом в контейнере.