Aplicaci贸n Dockerizing Flask usando Docker en Debian 10

Aplicaci贸n Dockerizing Flask usando Docker en Debian 10

Docker es una herramienta de c贸digo abierto dise帽ada para facilitar la creaci贸n, implementaci贸n y ejecuci贸n de aplicaciones mediante el uso de contenedores. Un contenedor es un paquete de software que empaqueta el c贸digo y todas sus dependencias para que la aplicaci贸n se ejecute de manera r谩pida y confiable de un entorno inform谩tico a otro.

Flask es un marco web popular de Python. Se clasifica como un microframework porque no requiere herramientas o bibliotecas particulares. En comparaci贸n con otros marcos, es liviano y altamente estructurado.

En este tutorial, explicaremos c贸mo implementar la aplicaci贸n Flask con Docker en el servidor Debian 10.

requisitos previos

  • Un servidor que ejecuta Debian 10.
  • Una contrase帽a de root est谩 configurada en su servidor.

Empezando

Antes de comenzar, es una buena idea actualizar el paquete de su sistema a la 煤ltima versi贸n. Puede actualizar todos los paquetes con el siguiente comando:

apt-get update -y
apt-get upgrade -y

Una vez que todos los paquetes est茅n actualizados, reinicie su sistema para aplicar los cambios.

Instalar las dependencias requeridas

A continuaci贸n, deber谩 instalar el servidor web Nginx y otras dependencias en su sistema. Puede instalarlos todos usando el siguiente comando:

apt-get install nginx apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -y

Una vez que todos los paquetes est茅n instalados, puede continuar con el siguiente paso.

Instalar ventana acoplable

De forma predeterminada, la 煤ltima versi贸n de Docker no est谩 disponible en el repositorio de Debian 10. Por lo que es buena idea instalarlo desde el repositorio oficial de Docker.

Primero, descargue y agregue la clave GPG con el siguiente comando:

wget https://download.docker.com/linux/debian/gpg apt-key add gpg

A continuaci贸n, agregue el repositorio de Docker con el siguiente comando:

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

A continuaci贸n, actualice el repositorio e instale Docker con el siguiente comando:

apt-get update -y
apt-get install docker-ce -y

Una vez que la instalaci贸n se haya completado con 茅xito, verifique el estado del Docker con el siguiente comando:

systemctl status docker

Deber铆as obtener el siguiente resultado:

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-04-19 06:26:25 UTC; 1min 8s ago
     Docs: https://docs.docker.com
 Main PID: 8883 (dockerd)
    Tasks: 10
   Memory: 46.6M
   CGroup: /system.slice/docker.service
           ??8883 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413828757Z" level=warning msg="Your kernel does not support swap memory limit
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413876690Z" level=warning msg="Your kernel does not support cgroup rt period"
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413889604Z" level=warning msg="Your kernel does not support cgroup rt runtime
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.414115814Z" level=info msg="Loading containers: start."
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.788332166Z" level=info msg="Default bridge (docker0) is assigned with an IP a
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.972022325Z" level=info msg="Loading containers: done."
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.010940205Z" level=info msg="Docker daemon" commit=afacb8b7f0 graphdriver(s)=o
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.011145541Z" level=info msg="Daemon has completed initialization"
Apr 19 06:26:25 debian10 systemd[1]: Started Docker Application Container Engine.
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.074603639Z" level=info msg="API listen on /var/run/docker.sock"

En este punto, Docker est谩 instalado y ejecut谩ndose. Ahora puede continuar con el siguiente paso.

Configuraci贸n de la estructura del directorio del matraz

A continuaci贸n, deber谩 crear una estructura de directorios para albergar su aplicaci贸n Flask.

Vamos a crear un directorio llamado matraz dentro del directorio /var/www/:

mkdir -p /var/www/flask

A continuaci贸n, cambie el directorio a un matraz y cree la estructura de directorios para el matraz:

cd /var/www/flask
mkdir -p app/static
mkdir -p app/templates

El directorio est谩tico se usa para almacenar im谩genes, CSS y archivos JavaScript, mientras que el directorio de plantillas se usa para almacenar las plantillas HTML para su proyecto.

A continuaci贸n, deber谩 crear un archivo __init__.py dentro del directorio de la aplicaci贸n:

nano app/__init__.py

Agregue los siguientes contenidos para crear una instancia de Flask e importe la l贸gica desde el archivo views.py:

from flask import Flask
app = Flask(__name__)
from app import views

Guarde y cierre el archivo, luego cree el archivo views.py en el directorio de su aplicaci贸n.

nano app/views.py

Agrega las siguientes l铆neas

from app import app
@app.route('/')
def home():
   return "hello world!"

Guarde y cierre el archivo, luego cree el archivo uwsgi.ini con el siguiente comando:

nano uwsgi.ini

Este archivo contendr谩 las configuraciones de uWSGI para nuestra aplicaci贸n como se muestra a continuaci贸n:

[uwsgi]
module = main
callable = app
master = true

Guarde y cierre el archivo cuando haya terminado. uWSGI es una opci贸n de implementaci贸n para Nginx que es tanto un protocolo como un servidor de aplicaciones.

A continuaci贸n, deber谩 crear el archivo main.py para importar la instancia de Flask llamada app desde el paquete de la aplicaci贸n. Puedes crearlo con el siguiente comando:

nano main.py

Agregue la siguiente l铆nea:

from app import app

Guarde y cierre el archivo cuando haya terminado. A continuaci贸n, cree un archivo requirements.txt para especificar las dependencias que el administrador de paquetes pip instalar谩 en su implementaci贸n de Docker:

nano requirements.txt

Agregue la siguiente l铆nea que coincida con la 煤ltima versi贸n de Flask:

Flask==1.1.2

Guarde y cierre el archivo cuando haya terminado.

En este punto, su aplicaci贸n Flask se ha configurado correctamente. Ahora puede continuar con el siguiente paso.

Configurar Docker para implementar Flask

A continuaci贸n, deber谩 crear un Dockerfile para compilar e implementar una aplicaci贸n de matraz.

Primero, crea un Dockerfile con el siguiente comando:

cd /var/www/flask
nano Dockerfile

Agregue las siguientes l铆neas:

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
RUN apk --update add bash nano
ENV STATIC_URL /static
ENV STATIC_PATH /var/www/app/static
COPY ./requirements.txt /var/www/requirements.txt
RUN pip install -r /var/www/requirements.txt

Guarde y cierre el archivo cuando haya terminado. A continuaci贸n, cree una secuencia de comandos start.sh para crear una imagen a partir de Dockerfile y cree un contenedor a partir de la imagen de Docker resultante.

nano start.sh

Agregue la siguiente l铆nea:

#!/bin/bash
app="docker.test"
docker build -t ${app} .
docker run -d -p 56733:80 \
  --name=${app} \
  -v $PWD:/app ${app}

Guarde y cierre el archivo cuando haya terminado.

Nota : Aseg煤rese de que el puerto 56733 est茅 libre y utilizable.

Finalmente, ejecute el script usando el siguiente comando:

bash start.sh

Esto crear谩 la imagen de Docker y construir谩 un contenedor a partir de la imagen resultante como se muestra a continuaci贸n:

Sending build context to Docker daemon  9.728kB
Step 1/6 : FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
python3.6-alpine3.7: Pulling from tiangolo/uwsgi-nginx-flask
48ecbb6b270e: Pull complete 
692f29ee68fa: Pull complete 
f75fc7ac1098: Pull complete 
c30e40bb471c: Pull complete 
Successfully built f5de17e1ce82
Successfully tagged docker.test:latest
22cd2bd23c9190cf2900fa1d7c55e4765a266e68c74dc1e6858872e9ebe7bdcd

Ahora puede enumerar los contenedores en ejecuci贸n con el siguiente comando:

docker ps

Deber铆as obtener el siguiente resultado:

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                            NAMES
22cd2bd23c91        docker.test         "/entrypoint.sh /sta鈥"   About a minute ago   Up About a minute   443/tcp, 0.0.0.0:56733->80/tcp   docker.test

Tambi茅n puede verificar el contenedor Docker visitando la URL http://your-server-ip:56733. Deber铆a ver la siguiente pantalla:

Implementar archivos de plantilla

Tambi茅n puede implementar archivos de plantilla para servir contenido est谩tico y din谩mico. Puede crear una plantilla de p谩gina de inicio para su aplicaci贸n con el siguiente comando:

nano app/templates/home.html

Agrega los siguientes c贸digos:

<!doctype html>

<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>Welcome Flask</title>
  </head>

  <body>
    <h1>Home Page</h1>
    <p>This is the home page of our flask application.</p>
  </body>
</html>

Guarde y cierre el archivo cuando haya terminado. A continuaci贸n, deber谩 modificar el archivo views.py para servir el archivo reci茅n creado:

nano app/views.py

Actualice el archivo como se muestra a continuaci贸n:

from flask import render_template

from app import app

@app.route('/')
def home():
   return "hello world!"

@app.route('/template')
def template():
    return render_template('home.html')

Guarde y cierre el archivo. Luego, deber谩 reiniciar los contenedores de Docker para aplicar los cambios.

Puede reiniciar el contenedor Docker llamado docker.test con el siguiente comando:

docker stop docker.test
docker start docker.test

Ahora, abra su navegador web y escriba la URL http://your-server-ip:56733/template. Deber铆a ver su plantilla reci茅n creada en la siguiente pantalla:

Conclusi贸n

隆Felicidades! Ha implementado con 茅xito una aplicaci贸n Flask con Docker en el servidor Debian 10. Ahora puede replicar la aplicaci贸n en diferentes servidores con una reconfiguraci贸n m铆nima. No dude en preguntarme si tiene alguna pregunta.

Deja una respuesta

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *