Запуск приложения 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
, или как это называется).
- получить идентификатор контейнера:
[sudo] docker ps -qf "name=<containername>"
- получить этот контейнер ip:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>
- подключитесь к
http://<the_resulting_ip>:5000/
Я сделал следующие шаги в моей системе:
- скопировал ваш код колбы и ваш Dockerfile
- создал требований.файл txt с
flask
первая строка - построил изображение и запустите его, как вы это сделали
Он отлично работает со мной:
$ 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