python - hub - Ejecutar la aplicación Flask en un contenedor Docker
download docker image (5)
Creé una imagen de Docker que contiene una simple aplicación de prueba de Flask:
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'')
usando el 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"]
La imagen de Docker se construyó usando docker build -t flask-app .
y ha sido creado con éxito:
$ 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
y lo he ejecutado usando:
$ docker run -d -p 5000:5000 flask-app
e92b249dd02ca44489069b783fa9be713c7a14ea893061194e37c80f16d8c931
Supongo que puedo probar la aplicación apuntando el navegador a http://localhost:5000/
pero obtengo un tiempo de espera. ¿Qué podría estar yendo mal?
- Obtener la ID del contenedor:
[sudo] docker ps -qf "name=<containername>"
- Obtener ese contenedor ip:
docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' <container_id>
- Luego, conéctese a
http://<the_resulting_ip>:5000/
Falta esta parte en 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'')
requisitos.txt
Flask==0.10.1
#or it can be any version
Dockerfile
FROM ubuntu:16.04
MAINTANER Your Name "[email protected]"
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 comandos para ejecutar
docker build -t flaskapp:latest .
#flask runs in default port 5000
docker run -d -p 5000:5000 flaskapp
Hice los siguientes pasos en mi sistema:
- Copió el código de su matraz y su archivo Docker
- Creó un archivo requirements.txt con un
flask
en la primera línea - Construyó la imagen y la ejecutó, como lo ha hecho
Me funciona bien:
$ curl localhost:5000
Hello World!
El proceso de docker no se ejecuta correctamente y la comprobación de registros está bien:
$ 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 -
Cuando inicie su contenedor acoplable, verifique si está escuchando el puerto 5000. Por ejemplo, en mi sistema:
$ 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
Es importante saber cómo está ejecutando dpcker, ¿se está ejecutando de forma nativa en una máquina de escritorio de Linux? ¿O lo está ejecutando dentro de una máquina virtual Linux en un host Mac / Windows (a través de un servicio como docker u otro método)? Si es así, entonces el problema podría ser que la dirección IP a la que debe acceder no es localhost, sino la dirección IP de la máquina virtual.
Tal vez su motor de docker no se está ejecutando en el mismo sistema operativo donde está lanzando su comando. Por ejemplo, si utiliza la ventana acoplable con ventanas, el motor acoplador (a menudo) se ejecuta dentro de una máquina virtual con una dirección IP diferente, por lo que debe escribir http: // [ máquina virtual IP ]: 5000 /
En alguna configuración, la URL correcta es http://192.168.99.100:5000/ (porque de forma predeterminada, en algunas configuraciones, la dirección IP de esa máquina virtual es 192.168.99.100)
Todo se ve bien desde aquí. Hagamos algunas depuraciones
Comencemos por iniciar nuestro contenedor con un nombre: docker run -d -p 5000:5000 --name flask-app-test flask-app
También puede evitar el indicador -d
y obtener los registros directamente en su pantalla.
Primero compruebe si la aplicación Flask se está ejecutando realmente o si se ha bloqueado. Comience con un simple docker ps
(vea si nota algo extraño allí) seguido de los docker logs flask-app-test
(estos serán los registros de la aplicación Flask, ¿se ha bloqueado? ¿Hay algo extraño?)
Si todo se ve bien hasta aquí, entonces es hora de ingresar al contenedor. Probemos con docker exec -ti flask-app-test bash
. Una vez que esté dentro, instale wget
por apt-get install wget
y luego pruebe si el servidor web funciona desde adentro al hacer wget http://localhost:5000
y al seleccionar el archivo descargado con suerte (seguido de cat file.html
, o como se llame).