Запуск приложения Flask в контейнере Docker

Я построил изображение Докера, содержащее простое приложение для тестирования колбы:

from flask import Flask 

app = Flask(__name__)

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

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

С помощью Dockerfile:

FROM ubuntu:latest
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app
RUN pip install -r /app/requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]

изображение Docker было построено с использованием docker build -t flask-app . и он был успешно создан:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
flask-app           latest              fab0d79fd7ac        8 minutes ago       642.2 MB
ubuntu              latest              104bec311bcd        5 weeks ago         129 MB

и я запустил его, используя:

$ docker run -d -p 5000:5000 flask-app
e92b249dd02ca44489069b783fa9be713c7a14ea893061194e37c80f16d8c931

Я предполагаю, что я могу проверить приложение, указав браузер на http://localhost:5000/ но я получаю тайм-аут. Что может быть не так?

5 ответов


отсюда все выглядит хорошо. Давайте сделаем отладку.

давайте начнем с запуска нашего контейнера с именем: docker run -d -p 5000:5000 --name flask-app-test flask-app

вы также можете избежать -d флаг и получить журналы прямо на экране.

сначала проверьте, действительно ли приложение Flask работает или, возможно, оно разбилось. Начните с простого docker ps (смотрите, если вы заметили что-нибудь странное там), а затем docker logs flask-app-test (это будут журналы приложения Flask, он разбился? быть там все странно?)

если все выглядит хорошо, пока здесь, то пришло время, чтобы войти в контейнер. Давайте попробуем с docker exec -ti flask-app-test bash. После того, как вы находитесь в, установить wget by apt-get install wget а затем проверьте, работает ли веб-сервер изнутри, выполнив wget http://localhost:5000 и cat - ting надеюсь, загруженный файл (ls следовал по cat file.html, или как это называется).


  1. получить идентификатор контейнера:

[sudo] docker ps -qf "name=<containername>"

  1. получить этот контейнер ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>

  1. подключитесь к http://<the_resulting_ip>:5000/

Я сделал следующие шаги в моей системе:

  1. скопировал ваш код колбы и ваш Dockerfile
  2. создал требований.файл txt с flask первая строка
  3. построил изображение и запустите его, как вы это сделали

Он отлично работает со мной:

$ curl localhost:5000
Hello World!

процесс докера не работает без проблем, и проверка журналов в порядке:

  $ docker ps
  CONTAINER ID        IMAGE               COMMAND             CREATED               STATUS              PORTS                    NAMES
  0c0228a88719        flask-app           "python app.py"     25 seconds ago      Up 24 seconds       0.0.0.0:5000->5000/tcp   frosty_borg

$ docker logs 0c0228a88719
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 216-035-222
172.17.0.1 - - [22/Jan/2017 12:56:37] "GET / HTTP/1.1" 200 -

когда вы начинаете вы контейнер докера, проверяете для того чтобы увидеть если он слушает порт 5000. Например, в моей системе:

     $ netstat -atn | grep 5000
     tcp6       0      0  ::1.5000               *.*                    LISTEN     
     tcp4       0      0  *.5000                 *.*                    LISTEN     
     $ docker stop 0c0228a88719
0c0228a88719
     $ netstat -atn | grep 5000
     $ # stops listening

важно, как вы запускаете dpcker, он запускается изначально на настольной машине linux? Или вы запускаете его в виртуальной машине Linux на хосте Mac / Windows (через службу, такую как docker machine или другой метод)? Если это так, проблема может заключаться в том, что IP-адрес, к которому вы должны получить доступ, не localhost, а IP-адрес виртуальной машины.


возможно, ваш docker engine не работает на той же ОС, где вы запускаете свою команду. Например. если вы используете docker с windows, Docker engine (часто) запускается внутри виртуальной машины с другим IP-адресом, поэтому вам нужно написать http: / / [IP виртуальная машина]:5000/

в некоторой конфигурации правильный URL-адрес http://192.168.99.100:5000/ (потому что по умолчанию, в некоторых конфигурациях IP адрес виртуальной машины 192.168.99.100)


отсутствует эта часть в Dockerfile

COPY ./requirements.txt /app/requirements.txt

Add this line to your Dockerfile before

app.py

from flask import Flask
app = Flask(__name__)

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

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

требований.txt

Flask==0.10.1
#or it can be any version

Dockerfile

FROM ubuntu:16.04
MAINTANER Your Name "youremail@domain.tld"
RUN apt-get update -y && \
    apt-get install -y python-pip python-dev
#your Dockerfile is missing this line
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app
ENTRYPOINT [ "python" ]
CMD [ "app.py" ]

команды docker для запуска

docker build -t flaskapp:latest .
#flask runs in default port 5000
docker run -d -p 5000:5000 flaskapp