Saltar al contenido principal

Backups de Docker

· 5 min de lectura
Pablo Pérez-Aradros
CISO SecDevOps @ Santander Group

Hola, hoy vamos a ver cómo gestionar backups en contenedores Docker o Podman.

Este tema puede ser algo tedioso, especialmente porque no existen herramientas nativas realmente cómodas para hacer backups completos de contenedores.

Sin embargo, yo abogo por un enfoque más limpio y eficiente: no se trata de hacer backups de los contenedores, sino de la información que realmente importa, es decir, de los volúmenes.

Sí, el comando docker commit te permite hacer un backup de un contenedor, pero no es ni la forma más práctica ni la más coherente con la filosofía de los contenedores.

Recordemos que los contenedores están diseñados para ser efímeros. La lógica de la aplicación ya está contenida en la imagen del contenedor. Lo que realmente necesitas proteger es la información persistente, que suele estar en volúmenes.

Por eso, en este vídeo te voy a mostrar distintas estrategias para hacer backups de aplicaciones que se ejecutan en contenedores, ya sea con Docker, Podman u otros motores compatibles.

Vamos a ir de lo más específico a lo más flexible, y al final te compartiré mi enfoque favorito: usar un contenedor auxiliar como sistema de backup automatizado. Así que quédate hasta el final si quieres verlo en acción.

Para todos los ejemplos, voy a partir de un contenedor de base de datos MySQL, pero puedes aplicar los mismos principios a cualquier otro tipo de contenedor que utilice volúmenes para almacenar datos persistentes. Por si quieres replicar el laboratorio, este contenedor lo he ejecutado con el siguiente comando:

docker run -d --name mysql-container \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-v mysql-data:/var/lib/mysql \
mysql:latest

Específicamente para una aplicacion

Partiendo del contenedor que hemos creado, podemos hacer un backup de la base de datos MySQL utilizando el comando mysqldump. Este comando nos permite exportar la base de datos a un archivo SQL que luego podemos utilizar para restaurar la base de datos en otro momento o en otro contenedor.

Recordad que tenemos el comando docker exec para ejecutar comandos dentro de un contenedor en ejecución. Además, la mayoría de aplicaciones que utilizan bases de datos tienen herramientas específicas para hacer backups instaladas en el contenedor. Para el caso de MySQL, podemos utilizar el siguiente comando para hacer un backup de la base de datos mydb:

docker exec -t <nombre_contenedor> /usr/bin/mysqldump -u root --password=<contraseña> <nombre_base_datos> > backup.sql

Para restaurar la base de datos desde el backup, podemos utilizar el siguiente comando:

docker exec -i <nombre_contenedor> /usr/bin/mysql -u root --password=<contraseña> <nombre_base_datos> < backup.sql

Este es uno de los métodos más sencillos y directos pero también depende de la tecnología en concreto y que la aplicación tenga una herramienta de backup.

Si quisiéramos algo más genérico que funcionase con cualquier aplicación, tendríamos que hacer un backup del volumen.

Backups local

Partiendo del contenedor y volumen de mysql, podemos hacer un backup del volumen utilizando el comando docker run para crear un contenedor temporal que monte el volumen y copie su contenido a un archivo tar. Este método es bastante genérico y funciona con cualquier tipo de volumen.

docker run --rm -v mysql-data:/data -v ${PWD}:/backup alpine:latest tar czf /backup/mysql-backup.tar.gz -C /data .

Ahora tendríamos un archivo mysql-backup.tar.gz en el directorio /tmp de nuestro sistema host que contiene el backup del volumen mysql-data.

Para restaurar, solo tendríamos que hacer el proceso inverso, es decir, crear un contenedor temporal que monte el volumen y copie el contenido del archivo tar al volumen.

Primero paramos el contenedor de MySQL para asegurarnos de que no hay procesos escribiendo en el volumen mientras hacemos la restauración:

docker stop mysql-container

También es recomendable eliminar los datos del volumen antes de restaurar el backup, para evitar conflictos con los datos existentes. Podemos hacerlo con el siguiente comando:

docker run --rm -v mysql-data:/data alpine sh -c "rm -rf /data/*"

Luego, restauramos el backup del volumen utilizando el siguiente comando:

docker run --rm -v mysql-data:/data -v ${PWD}:/backup alpine:latest sh -c "cd /data && tar xzf /backup/mysql-backup.tar.gz"

Finalmente, iniciamos de nuevo el contenedor de MySQL:

docker start mysql-container

Usando un contenedor como filesystem

¿Sabías que podías utilizar el sistema de archivos de un contenedor como un repositorio para un backup?. Esta es una de las opciones que más me gusta y que más facilita el almacenamiento en servidores remotos, el versionado y la recuperación de backups.

Utilizaremos la herramienta oras para hacer un backup de un volumen de Docker y almacenarlo en un repositorio remoto. Link de la herramienta: oras.

Suponiengo que tenemos un contenedor de mysql llamado mysql-container y queremos hacer un backup de su volumen. Podemos lanzar otro contenedor que tenga la herramienta oras instalada y que se encargue de hacer el backup del volumen y subirlo a un repositorio remoto.

oras push docker.io/pabpereza/mysql-backups:latest mysql-backup.tar.gz

Recuerda que debes tener configurado el acceso al repositorio remoto y que la herramienta oras esté instalada en el contenedor. Puedes cargar los credenciales de acceso al repositorio remoto utilizando variables de entorno o montando un archivo de configuración en el contenedor.

Por ejemplo, si estás utilizando Docker Hub, puedes autenticarte con el siguiente comando antes de ejecutar el backup:

docker login registry-remoto

Oras obtendrá los credenciales de acceso al repositorio remoto y podrá subir el backup del volumen de Docker.

También podríamos descargar de nuevo el backup del volumen utilizando el comando oras pull:

oras pull docker.io/pabpereza/mysql-backups:latest

¿Se puede pulir aún más?

Si, yo creo que sí, pero por hoy es suficiente. Para el próximo, os prometo ver estos últimos ejemplos combinados con los perfiles de compose. Ya veréis que pasada.

¿Te ha gustado Oras? Escribe un issue en el repositorio de GitHub para que lo veamos en el próximo artículo.

¡Hasta la próxima!

Ruta DevSecOps, recomendaciones para empezar en 2025

· 4 min de lectura
Pablo Pérez-Aradros
CISO SecDevOps @ Santander Group

Ahora sí, la parte más soicitada. ¿Cómo llegar a ser un devops o devsecops en 2025? ¿Qué tecnologías aprender? ¿Qué camino seguir?

Recuerda que esta es la parte 2 y en este primer capítulo te contaba mi historia personal de como llegué yo a este punto. Entrada del blog

Por último, matizar que esta es una opinión personal. Cada uno podría tener su propio camino y su propia forma de aprender.

Vamos a ver, una breve introducción a lo que es DevOps, luego veremos las tecnologías básicas para empezar y, por útlimo, hablaremos de los métodos de aprendizaje, certificaciones y demás.

Este es el diagrama que he creado para resumir las tecnologías y conceptos básicos que deberías conocer para empezar en DevSecOps. Lo puedes descargar y utilizar como guía de estudio. DevSecOps Roadmap 2025

¿Qué es DevOps?

DevOps es una metodología que busca mejorar la colaboración entre los equipos de desarrollo (Dev) y operaciones (Ops) para acelerar la entrega de software y mejorar la calidad del mismo. Se basa en la automatización, la integración continua y la entrega continua (CI/CD), así como en la monitorización y el feedback constante.

Esto permite a las organizaciones responder más rápidamente a las necesidades del mercado y a los cambios en los requisitos de los clientes.

¿Qué es DevSecOps?

DevSecOps es una metodología que integra la seguridad en el ciclo de vida del desarrollo de software (SDLC). Su objetivo es garantizar que la seguridad sea una parte integral del proceso de desarrollo, en lugar de ser un añadido posterior. Esto implica la colaboración entre equipos de desarrollo, operaciones y seguridad para identificar y abordar vulnerabilidades desde las primeras etapas del desarrollo.

Tecnologías y conceptos básicas para empezar

De la parte más personal extraido los siguientes perfiles, más o menos, por los que he ido pivotando:

-> Desarrollador web y aprendiz de seguridad -> Pentester -> SSDLC -> DevOps -> DevSecOps

En base a mi experiencia actual, creo que la forma más rápida para llegar a este tipo de perfil sería ir directo a un rol DevOps y, con un poco de experiencia, añadir la parte de seguridad. También en función de las empresas que trabajes, igual esperan de ti un rol que vaya más a la parte de infraestructura cloud y apoyar la parte de IaC (Infrastructure as Code) o como SRE (Site Reliability Engineer) si tienes un perfil más de sysadmin.

En cualquier caso, si te interesa también la seguridad (desde la perspectiva DevSecOps) verás que a corto, es tan simple como aprender a integrar herramientas de seguridad en los pipelines aunque, a largo plazo, si te toca gestionar las vulnerabilidades, planes de remediación, etc. tendrás que tener un conocimiento de seguridad más profundo.

Vamos a comenzar por el desglose del rol de DevOps.

DevOps

El rol de DevOps es un perfil que ha ido evolucionando en los últimos años y que, en la actualidad, se ha convertido en uno de los más demandados en el sector tecnológico. Estos serían los conocimientos básicos que deberías tener para empezar:

  • Lenguajes de programación
  • Git
  • CI/CD
  • Contenedores
  • Monitorización

DevSecOps y SSDLC

El rol de DevSecOps es una evolución del rol de DevOps, que integra la seguridad en el ciclo de vida del desarrollo de software. Para este rol, además de los conocimientos básicos de DevOps, deberías tener conocimientos en Seguridad en el Desarrollo de Software (SSDLC), que incluye:

  • Threat Modeling
  • SAST
  • SCA
  • DAST
  • RASP

También es importante tener conocimientos de seguridad en áreas específicas como:

  • Seguridad en la nube
  • IAM (Identity and Access Management)
  • Seguridad en contenedores
  • Seguridad en APIs y microservicios

Certificaciones

Haré otro capítulo específico para hablar de certificaciones y entorno académico, ¡no olvides suscribirte!

¿Ollama killer?, Modelos de IA en Docker Desktop

· 3 min de lectura
Pablo Pérez-Aradros
CISO SecDevOps @ Santander Group

Sin duda Ollama es la herramienta más popular para ejecutar modelos de IA en local, pero Docker ha lanzado una nueva funcionalidad que permite ejecutar modelos de IA de forma sencilla e integrada en Docker Desktop.

En este artículo, exploraremos cómo ejecutar modelos de IA como Llama o deepseek en Docker Desktop, gracias a la nueva funcionalidad de docker model. ¿Estará a la altura?

Ya estuve hablando de esta funcionalidad durante su fase beta en este vídeo: https://youtu.be/RPrZXQiIy_k

Su mayor limitación era una ausencia de interfaz práctica para modelos y que solo funcionaba en Mac. Tras solventar esto, ahora podemos ejecutar modelos de IA en Docker Desktop de forma sencilla y rápida.

Requisitos

  • Docker Desktop 4.41 o superior
  • 8 Gb de RAM

Descargar un modelo en Docker Desktop

Para descargar un modelo, simplemente ejecutamos el siguiente comando:

docker model pull <nombre del modelo>

Otra novedad es que ahora tenemos una sección de modelos en el Docker Hub, donde podemos ver los modelos disponibles y su documentación.

Puedes acceder a esta sección en el siguiente enlace: https://hub.docker.com/catalogs/models

Tras descargar el modelo, podemos utilizar la sección de docker desktop para ver los modelos que tenemos disponibles.

Ejecutar un modelo

Para ejecutar un modelo, simplemente ejecutamos el siguiente comando:

docker model run <nombre del modelo>

En este caso, el modelo se ejecutará en modo interactivo y nos permitirá interactuar con él a través de la terminal.

También podríamos ejecutar el modelo con un prompt de entrada, por ejemplo:

docker model run <nombre del modelo> --prompt "¿Cuál es la capital de España?"

Esto nos permitirá obtener una respuesta del modelo sin necesidad de interactuar con él a través de la terminal.

Ejemplos de aplicaciones utilizando modelos

Para esta parte, docker ha creado tres ejemplos de chats sencillos que interactúan con los modelos de IA proporcionados por docker.

Los tenemos en el siguiente repositorio: https://github.com/docker/hello-genai

Podemos ejecutar los ejemplos de la siguiente manera:

chmod +x run.sh
./run.sh

Este script realiza un pull del modelo necesario y ejecuta las diferentes aplicaciones de chat. Puedes acceder a ellas a través de la siguiente URL: http://localhost:8080, http://localhost:8081 y http://localhost:8082

También puedes editar el modelo a utilizar cambiando los valores del fichero .env que por defecto son los siguientes:

# Configuration for the LLM service
LLM_BASE_URL=http://model-runner.docker.internal/engines/llama.cpp/v1

# Configuration for the model to use
LLM_MODEL_NAME=ai/llama3.2:1B-Q8_0

Conclusiones

Docker ha lanzado esta nueva funcionalidad que sin duda facilitará la vida a muchos desarrolladores que quieran experimentar con modelos de IA sin necesidad de tener un entorno complejo o complicado.

Si que echo en falta poder utilizarlo en Docker Engine sobre servidores linux, pero no dudo en que lo veremos muy pronto.

Espero que este artículo te haya sido útil y que te animes a probar esta nueva funcionalidad de Docker Desktop.

Un abrazo y nos vemos en el siguiente.