Docker - Ejercicios
Recursos
- Guía basica de docker y dockerfile
- Guía resumida de docker-compose
- Guía detallada de docker-compose
- PDF resumen general de Docker
Estos documentos no son propiedad de la asignatura, contienen información adicional que consultar y todos los créditos son para sus autores.
Ejercicio 1: Imágenes de desarrollo
Hemos visto cómo crear diferentes perfiles para la creación de un backend de producción y un backend de desarrollo usando una única imagen común. En este ejercicio se pide crear una separación entre producción y desarrollo para la base de datos.
services:
database:
image: mariadb:10.11
restart: unless-stopped
container_name: database
hostname: database
user: mysql
environment:
MARIADB_ROOT_PASSWORD: root
MARIADB_DATABASE: tienda
volumes:
- ./database/datadir:/var/lib/mysql
- ./database/seed:/docker-entrypoint-initdb.d/
La imagen de producción debe tener un usuario y contraseña por defecto, mientras que la imagen de desarrollo debe tener un usuario y contraseña específicos. Se debe considerar que esto afecta al despliegue del backend y debe modificarse como corresponda. Como ejercicio adicional, se puede incorporar los valores de producción a través de secretos. Revisar también la documentación oficial de la imagen de MariaDB para ver cómo se pueden configurar estos valores.
Ejercicio 2: Creación de un sistema de logs
Hemos visto ya en teoría cómo podemos almacenar logs en FastAPI. Sabemos que docker no solo registra los logs creados por el usuario, sino también los que genera el contenedor en su ejecución. En este ejercicio se pide crear un sistema de logs para el backend y la base de datos, registrando al menos un log generado por el usuario en el backend. Los logs deben ser almacenados en un fichero y deben ser accesibles desde el exterior.
Docker Compose permite utilizar una configuración de logs para cada servicio, mediante la directiva logging
. Puedes consultar el funcionamiento de esta directiva en la documentación oficial. El siguiente ejemplo configuraría los logs de un servicio para que se almacenen en un fichero y se roten cada 5MB, manteniendo un máximo de 2 ficheros:
Como requerimiento adicional, se pide que los logs generados en el backend por el usuario y no por FastAPI sean redirigidos a un fichero diferente al fichero que estipula docker y que esto se configure en el fichero docker-compose.yml
usando la librería logging
de Python.
Además, investiga cómo puedes utilizar una herramienta de logging más sofiscticada como Fluentd, Logstash o Graylog. En este tutorial recomiendo utilizar Fluentd, ya que es una herramienta sencilla y fácil de configurar. Podemos utilizar la imagen oficial de Fluentd y configurarla para que envíe los logs a un servidor de logs, más información en el siguiente enlace.
Ejercicio 3: Creación de una red privada
En este ejercicio se pide crear una red privada para el backend y la base de datos. La red debe ser accesible únicamente por los servicios que la componen y no debe ser accesible desde el exterior. Ahora mismo, la política de red es bridge
, que permite la comunicación entre contenedores y el exterior. Para crear una red privada, debemos crear una red personalizada y asignarla a los servicios que queramos que se comuniquen entre sí.
<nombre_red>
es el nombre que asignamos a la red. Puedes consultar la documentación oficial para más información sobre cómo configurar redes en Docker Compose.
A esta configuración se solicita añadir una máscara de red 10.5.0.0/16
para que los servicios puedan comunicarse entre sí bajo una dirección IP específica. Posteriormente, por cada servicio se debe asignar la red creada y la dirección IP que se considere siempre y cuando esté dentro de la máscara de red.
Aunque esta creación de IPs es virtual, nos permite mejorar la seguridad al aislar los servicios entre sí. No solo eso, sino que también nos permite simular una situación realista donde cada uno de los servicios se encuentra en una máquina diferente. Aunque usualmente este proceso se realiza a través de un orquestador como Kubernetes, Docker nos permite simular esta situación.