Docker Compose es una herramienta que permite definir contenedores, volúmenes, redes y otros parámetros en un archivo YAML, lo que documenta de forma clara cómo están configurados tus servicios y facilita su mantenimiento y actualización.
¿Por qué usar Docker Compose?
Documentación clara: Todas las configuraciones (puertos, volúmenes, variables de entorno, etc.) están en un solo archivo.
Reproducibilidad: Puedes recrear (exportar) tus contenedores en cualquier sistema con el mismo archivo. Ideal para laboratorios y cursos.
Simplicidad: Actualizar un contenedor es tan sencillo como editar un archivo de texto YAML.
Ejemplo: Configuración con Docker Compose
Imaginemos que tienes un contenedor de AlmaLinux con un volumen persistente para los datos. El equivalente en Docker Compose sería:
services:
linux:
image: almalinux:latest
container_name: linux3
volumes:
- mydata:/data
ports:
- "8080:80"
volumes:
mydata:
Todo está documentado: El archivo YAML incluye:
· La imagen utilizada.
· Los volúmenes montados para persistencia.
*Es MUY IMPORTANTE que exista VOLUMES BindMount antes de actualizar o perderemos datos. Ver más adelante.
· Los puertos abiertos o mapeados.
Portabilidad: Si quieres compartir el entorno con otros compañeros, usuarios o alumnos, simplemente puedes darles el archivo docker-compose.yml y se replicará tu mismo laboratorio.
Paso0: Verificación
Verifica si los datos están persistentes
Antes de proceder, verifica si el contenedor utiliza volúmenes o bind mounts. Esto nos asegurará que los datos están almacenados fuera del contenedor:
docker inspect <container_name>
docker inspect linux1
Si “Mounts” aparece [] (vacío):
Si “Mounts” aparece vacío significa que perderemos todos los datos al eliminar el contenedor.
NO ACTUALICES O PERDERÁS DATOS.
Por ejemplo si està en modo “bind”:
docker inspect linux3
Busca la sección Mounts en el resultado.
O está en modo “volume”:
docker inspect linux2
Significa que los datos están persistentes y no se perderán al eliminar el contenedor.
Ejemplo: Configuración con Docker Compose
Imaginemos que tienes un contenedor de AlmaLinux con un volumen persistente para los datos. El equivalente en Docker Compose sería:
Archivo docker-compose.yml (configuración correcta):
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
volumes:
- mydata:/data
ports:
- "8080:80"
volumes:
mydata:
Ejemplos de configuraciones que podrían perder datos
Si no configuras correctamente los volúmenes, los datos generados dentro del contenedor estarán vinculados únicamente al sistema de archivos del contenedor. Esto significa que al actualizar o eliminar el contenedor, los datos se perderán.
Ejemplo1: Configuración sin volúmenes ni bind mounts
En este caso, no se ha definido un volumen o bind mount para persistir los datos:
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
ports:
- "8080:80"
Consecuencia: Cualquier dato almacenado dentro del contenedor (en /data o cualquier otro directorio) se perderá al eliminar o actualizar el contenedor, ya que no hay persistencia configurada.
Ejemplo2: Configuración incorrecta del volumen
Un error común es definir un volumen incorrectamente o no mapearlo al directorio donde se generan los datos.
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
volumes:
- /ruta/invalida/en/el/host:/data
ports:
- "8080:80"
- Problema: La carpeta ruta/invalida/en/el/host en el host puede no existir o estar mal configurada.
- Consecuencia: Docker crea una carpeta vacía temporalmente, pero los datos pueden no persistir correctamente al eliminar el contenedor.
Ejemplo3: Uso exclusivo del sistema de archivos interno
A veces, se omiten volúmenes para mantener configuraciones mínimas, confiando únicamente en el sistema de archivos interno del contenedor:
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
ports:
- "8080:80"
- Consecuencia: Aunque la configuración parece funcionar, los datos generados dentro del contenedor no serán accesibles ni persistirán si este se elimina o actualiza.
Cómo evitar perder datos
- Siempre usa volúmenes o bind mounts: Configura correctamente los volúmenes para que los datos estén almacenados fuera del ciclo de vida del contenedor.
- Prueba tu configuración: Antes de realizar tareas críticas, verifica que los datos están mapeados correctamente. Puedes comprobarlo con:
docker inspect <container_name>
- Ejemplo con bind mounts:
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
volumes:
- C:\Linux3-Data:/data
ports:
- "8080:80"
Paso 1 Actualización:
Una vez asegurado que los datos son persistentes (si seguimos con dudas: Ver Persistencia de datos en contenedores Docker) podemos proceder a actualizar el contenedor, solo necesitas cambiar la versión de la imagen en el archivo:
Ejemplo de imagen de Linux forzada a Almalinux8.8:
version: '3.9'
services:
linux:
image: almalinux:8.8
container_name: linux3
volumes:
- mydata:/data
ports:
- "8080:80"
volumes:
mydata:
Pasar a Almalinux 9.2
version: '3.9'
services:
linux:
image: almalinux:9.2
container_name: linux3
volumes:
- mydata:/data
ports:
- "8080:80"
volumes:
mydata:
O a la última disponible
version: '3.9'
services:
linux:
image: almalinux:latest
container_name: linux3
volumes:
- mydata:/data
ports:
- "8080:80"
volumes:
mydata:
Luego, aplicas los cambios con:
docker-compose pull
docker-compose up -d
Y ya tendremos actualizado el contenedor sin perder datos.
El autor de este post es Pol Padrisa
No hay comentarios:
Publicar un comentario