Ejecutando la aplicación Frask en un contenedor Docker

He construido una imagen de Docker que contiene una aplicación de prueba sencilla 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ó utilizando la aplicación docker build -t flask-app . y se ha 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 salir mal?

Todo se ve bien desde aquí. Vamos a hacer un poco de depuración.

Comencemos por iniciar nuestro contenedor con un nombre: docker run -d -p 5000:5000 --name flask-app-test flask-app

También puede evitar la -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 sencillo 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 estrellado? ¿Hay algo extraño?)

Si todo se ve bien hasta aquí, es hora de entrar en el contenedor. Vamos a probar con el 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 haciendo wget http://localhost:5000 y administrando el archivo descargado con suerte ( ls seguido de cat file.html , o como se llame).

  1. Obtener el ID del contenedor:

[sudo] docker ps -qf "name="

  1. Obtener ese contenedor ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}'

  1. Luego conéctese a http://:5000/

Hice los siguientes pasos en mi sistema:

  1. Copie su código de matraz y su Dockerfile
  2. Creé un archivo flask con el flask en la primera línea.
  3. Construye la imagen y ejecútala, como lo has hecho.

Funciona bien conmigo:

 $ curl localhost:5000 Hello World! 

El proceso de la ventana acoplable que se está ejecutando no presenta ningún problema y la verificació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 el contenedor de la ventana 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 destacar que, ¿cómo está ejecutando dpcker, se está ejecutando de forma nativa en una máquina de escritorio Linux? ¿O lo está ejecutando dentro de una máquina virtual de Linux en un host de Mac / Windows (a través de un servicio como un dispositivo docker u otro método)? Si es así, entonces el problema podría ser que la IP a la que debería acceder no sea localhost, sino la dirección IP de la Máquina Virtual.

Tal vez el motor de la ventana acoplable no se esté ejecutando en el mismo sistema operativo en el que está ejecutando su comando. Por ejemplo, si utiliza la ventana acoplable con Windows, el motor de la ventana acoplable se ejecuta (a menudo) dentro de una máquina virtual con una IP diferente, por lo que necesita escribir http: // [ máquina virtual IP ]: 5000 /

En algunas configuraciones, 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)

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 "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" ] 

comandos docker para ejecutar

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