Python Flask Gunicorn Docker
Índice
- Paso 1: instalar paquetes
- Paso 2: crear entorno virtual
- Paso 3: crear una aplicación de ejemplo en
Flask
- Paso 4: crear punto de entrada
- aso 5: configurar el servidor
Gunicorn
- Paso 6: arrancar el servidor cuando se inicie el sistema
- Paso 7: configurar el servidor
Nginx
Arquitectura
Paso 1: instalar paquetes
$ sudo apt update $ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Paso 2: crear entorno virtual
$ sudo apt install python3-venv
# Creamos directorio para la aplicación
$ mkdir ~/myproject
$ cd ~/myproject
# crear entorno virtual
$ python3.6 -m venv myprojectenv
# Activar entorno virtual
$ source myprojectenv/bin/activate
Paso 3: crear aplicación Flask
$ pip install wheel
(myprojectenv) $ pip install gunicorn flask
~/myproject/myproject.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
# Ejecutamos la aplicación y con nuestro navegador hacemos una llamada
$ python myproject.py
# CTRL-C para parar el servidor
Paso 4: crear punto de entrada
Crear el archivo ~/myproject/entrypoint.py
from myproject import application
if __name__ == "__main__":
application.run()
Paso 5: Configurar sel servidor Gunicorn
(myprojectenv) $ cd ~/myproject
# Ejecutamos el servidor asignando la ip y el puerto
(myprojectenv) $ gunicorn --bind 0.0.0.0:5000 entrypoint:application
# Abrir el navegador y comprobar que el servidor responde a nuestras peticiones
# CTRL-C en el terminal para parar el servidor
# Desactivamos el entorno virtual
(myprojectenv) $ deactivate
Paso 6: arrancar el servidor cuando se inicie el sistema
# Ejecutamos la aplicación y con nuestro navegador hacemos una llamada
$ python myproject.py
# CTRL-C para parar el servidor
Paso 4: crear punto de entrada
Crear el archivo ~/myproject/entrypoint.py
from myproject import application
if __name__ == "__main__":
application.run()
Paso 5: Configurar sel servidor Gunicorn
(myprojectenv) $ cd ~/myproject
# Ejecutamos el servidor asignando la ip y el puerto
(myprojectenv) $ gunicorn --bind 0.0.0.0:5000 entrypoint:application
# Abrir el navegador y comprobar que el servidor responde a nuestras peticiones
# CTRL-C en el terminal para parar el servidor
# Desactivamos el entorno virtual
(myprojectenv) $ deactivate
Paso 6: arrancar el servidor cuando se inicie el sistema
A continuación, crearemos el archivo de unidad de servicio systemd. Crear un archivo de unidad systemd permitirá que el sistema init de Ubuntu inicie automáticamente Gunicorn y haga funcionar la aplicación de Flask cuando el servidor se cargue.
Crear un archivo terminado en .service dentro del directorio /etc/systemd/system para empezar:
$ sudo nano /etc/systemd/system/myproject.service
Nombre del fichero /etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
# Iniciar y activar el servicio que hemos creado
$ sudo systemctl start myproject
$ sudo systemctl enable myproject
$ sudo systemctl status myproject
Paso 7: Configurar el servidor Nginx
Ahora, nuestro servidor de aplicación Gunicorn debería estar funcionando, esperando solicitudes en el archivo de socket del directorio del proyecto. Configuraremos Nginx para que transmita las solicitudes web al socket haciendo algunas pequeñas adiciones a su archivo de configuración.
Abra un bloque de servidor e indique a Nginx que escuche en el puerto predeterminado 80. También le indicaremos que utilice este bloque para solicitudes para el nombre de dominio de nuestro servidor:
En el archivo /etc/nginx/sites-available/myproject
server {
listen 80;
server_name your_domain www.your_domain;
location / {
include proxy_params;
proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
}
}
Gunicorn (servidor HTTP)
Gunicorn, también conocido como Green Unicorn (Unicornio Verde), es un servidor WSGI HTTP para Python.
Instalar el servidor Gunicorn
$ pip install gunicorn
Cree el archivo wsgi.py
from helloworld import app
if __name__ == "__main__":
app.run()
gunicorn --bind 0.0.0.0.0:8000 wsgi:app
En el navegador: localhost:80000 y veremos el mensaje …
Detén el servidor gunicornio usando Ctrl-C.
Docker
Crear el docker file
FROM python:3.6-alpine
RUN adduser -D helloworlduser
RUN mkdir -p /home/flask_app/helloworld
WORKDIR /home/flask_app/helloworld
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY helloworld.py wsgi.py boot.sh ./
RUN chmod +x boot.sh
ENV FLASK_APP helloworld.py
RUN chown -R helloworlduser:helloworlduser ./
USER helloworlduser
EXPOSE 5000
ENTRYPOINT ["./boot.sh"]
Script de inicio
El script de inicio boot.sh:
#!/bin/sh
# called by Dockerfile
# go to directory where wsgi.py is
cd /home/flask_app/helloworld
# start gunicorn
exec gunicorn -b :5000 --access-logfile - --error-logfile - wsgi:app
Construir la imagen
$ docker build -t helloworld:latest
Ejecutar las imagenes del contenedor
```sh
Ejecutar la aplicación en primer plano
$ docker run –nombre helloworld -p 8001:5000 –rm helloworld:latest
Ejecutar la aplicación en segundo plano
$ docker run –nombre helloworld -d -p 8001:5000 –rm helloworld:latest
Ver que el contenedor esta en ejecución
$ docker ps
Ver logs
$ docker logs helloworld
Parar el contenedor
$ docker kill helloworld $ docker ps