Nota: (ponemos a prueba los conceptos clave de Docker Compose mientras se crea una aplicación web de Python la aplicación que usare es Flask y con un contador de visitas en Redis. (Este ejemplo esta basado en el que expone docs.docker).
Escenario-Docker-Compose
Nota: Flask es un framework minimalista escrito en Python que permite crear aplicaciones web rápidamente y con un mínimo número de líneas de código. Está basado en la especificación WSGI de Werkzeug y el motor de templates Jinja2 y tiene una licencia BSD.
Nota: Redis es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes pero que opcionalmente puede ser usada como una base de datos durable o persistente.
Nota: Creamos la aplicación web con un dockerfile con el cual creare una imagen de Docker. La imagen contiene todas las dependencias que requiere la aplicación de Python, incluido el propio Python.
# código web.Dockerfile
- FROM python:3.7-alpine
- WORKDIR /code
- ENV FLASK_APP=app.py
- ENV FLASK_RUN_HOST=0.0.0.0
- RUN apk add –no-cache gcc musl-dev linux-headers
- COPY requirements.txt requirements.txt
- RUN pip install -r requirements.txt
- EXPOSE 5000
- COPY . .
- CMD [«flask», «run»]
Creamos con nano web.Dockerfile:
- In: root@juan-SATELLITE-C55-C-1JM:/my-dockerfile# nano web.Dockerfile
Comentemos el código que nos ocupa:
#Cree una imagen comenzando con la imagen de Python 3.7.
- FROM python:3.7-alpine
#Establezer el directorio de trabajo en /code.
- WORKDIR /code
#Establezer las variables de entorno utilizadas por el flask comando.
- ENV FLASK_APP=app.py
- ENV FLASK_RUN_HOST=0.0.0.0
#Instalar gcc y otras dependencias
- RUN apk add –no-cache gcc musl-dev linux-headers
#Copie requirements.txt e instale las dependencias de Python
- COPY requirements.txt requirements.txt
- RUN pip install -r requirements.txt
#Agregue metadatos a la imagen para describir que el contenedor está escuchando en el puerto 5000
- EXPOSE 5000
#Copie el directorio actual . del proyecto en el directorio de trabajo . de la imagen.
- COPY . .
#Establezca el comando predeterminado para el contenedor en flask run .
- CMD [«flask», «run»]
Nota: Configurar los servicios en un archivo Compose crear un archivo llamado docker-compose.yml en una carpeta en la cual crearemos el proyecto.
Creamos la carpeta del proyecto:
- In: root@juan-SATELLITE-C55-C-1JM:/# mkdir test-compose && cd test-compose
Arrancar nano:
- In: root@juan-SATELLITE-C55-C-1JM:/test-compose# nano docker-compose.yml
Pego el siguiente texto:
- version: «3.9»
- services:
- web:
- build: .
- ports:
- – «8000:5000»
- redis:
- image: «redis:alpine»
Nota: Este archivo docker-compose.yml crea dos servicios: web y redis.
- El web servicio usa una imagen que se crea a partir del web.Dockerfile. Luego vincula el contenedor y la máquina host al puerto expuesto, 8000. Este servicio de usa el puerto predeterminado para el servidor web Flask, 5000. El redis servicio utiliza una imagen pública de Redis extraída del registro de Docker Hub.
Iniciar la aplicación ejecutando:
- In: root@juan-SATELLITE-C55-C-1JM:/test-compose# docker-compose up
Nota: Compose extrae la Images-Redis, crea una imagen para su código e inicia los Servicios. El código se copia estáticamente en la imagen en el momento de la compilación.
Nota: Pegue http://localhost:8000/ o http://127.0.0.1:8000 en un navegador para ver la aplicación ejecutándose.
Editar docker-compose.yml agregar un volumes
- version: «3.9»
- services:
- web:
- build: .
- ports:
- – «8000:5000»
- volumes:
- – .:/code
- environment:
- FLASK_DEBUG: True
- redis:
- image: «redis:alpine»
Arrancar nano:
- In: root@juan-SATELLITE-C55-C-1JM:/test-compose# nano docker-compose.yml
Nota: el volumes monta el directorio del proyecto (directorio actual) en el host, /code dentro del contenedor, lo que le permite modificar el código sobre la marcha, sin tener que reconstruir la imagen. El environment clave establece la FLASK_ENV variable de entorno, que le indica flask run que se ejecute.
Compilar la aplicación, actualizar y ejecútar:
- In: root@juan-SATELLITE-C55-C-1JM:/test-compose# docker-compose up
Recopilando:
En primer lugar se genera web.Dockerfile con una breve comentario de su código, es importante crear una carpeta para el proyecto, configuramos los Services web y redis, por ultimo editamos la compilación para agregar un volumes caso habitual de pues de crear una aplicación la necesidad de tener volumes.
- Referencias: Entorno-Moreluz
- Referencias: docs.docker