Domina la persistencia de datos en Docker usando volúmenes. Con Docker Compose, un volumen bind impulsa la edición en vivo de un sitio con NGINX, mientras que los volúmenes nombrados conservan datos críticos de MySQL aun cuando el contenedor se detiene. Aquí verás el flujo, los comandos y las rutas clave para trabajar sin perder nada.
¿Cómo asegurar la persistencia de datos en Docker con volúmenes?
El reto típico: al apagar un contenedor, todo lo que estaba adentro se pierde. La solución directa son los volúmenes, que separan los datos del ciclo de vida del contenedor.
¿Qué problema resuelven los volúmenes en contenedores?
Evitan la pérdida de datos al detener contenedores.
Permiten compartir archivos entre host y contenedor.
Habilitan flujos de trabajo ágiles sin reconstruir imágenes en cada cambio.
¿Cómo preparar el entorno con carpetas y archivos clave?
Crear la carpeta de proyecto llamada Volúmenes. Se omite acento para evitar problemas en control de versiones.
Dentro, crear la carpeta HTML y el archivo index.html como portada.
Definir docker-compose.yml para orquestar tres servicios: un web con NGINX y dos con volúmenes nombrados.
¿Cómo levantar y validar servicios con Docker Compose?
Ejecutar los servicios con comandos sencillos.
cd Volúmenes
docker compose up
docker volume ls
El servicio web usa la imagen de NGINX, expone un puerto y enlaza HTML a la ruta /usr/share/nginx/html.
Abrir localhost en el navegador: se muestra tu página de inicio personalizada.
¿Qué diferencia hay entre volúmenes bind y volúmenes nombrados?
Hay dos tipos: volumen bind y volumen nombrado. Ambos separan datos del contenedor, pero resuelven necesidades distintas.
¿Cómo funciona un volumen bind para desarrollo web con NGINX?
Enlaza la carpeta HTML local con /usr/share/nginx/html en el contenedor.
Cambios en index.html se reflejan al recargar el navegador.
Beneficio clave: edición en vivo sin reconstruir la imagen en cada modificación.
¿Cómo usar volúmenes nombrados para datos de MySQL?
Un servicio de MySQL apunta su almacenamiento a /var/lib/mysql con un volumen nombrado (por ejemplo, dbdata).
Aunque el contenedor muera, las bases de datos permanecen gracias al volumen.
Otro servicio puede usar un volumen nombrado adicional (por ejemplo, appdata) para su propio estado.
¿Qué beneficios prácticos aportan en el día a día?
Mantener datos críticos sin sobresaltos.
Probar cambios rápidamente en un sitio con NGINX.
Separar código e infraestructura del estado de la aplicación.
¿Cómo inspeccionar y gestionar volúmenes en Docker Desktop y terminal?
Usa tanto la terminal como Docker Desktop para confirmar que los volúmenes existen y están en uso.
¿Cómo verificar volúmenes con docker volume ls?
Ejecutar docker volume ls para listar volúmenes: verás appdata y dbdata creados por Docker Compose.
Identificar cuáles están en uso por contenedores activos.
¿Cómo explorar archivos montados desde Docker Desktop?
En Docker Desktop, abrir la sección Volúmenes: ver appdata y dbdata en uso.
Navegar por contenedor y pestaña de files para confirmar rutas montadas.
En el servicio de base de datos, comprobar /var/lib/mysql marcado como volumen.
¿Qué ocurre cuando detienes los contenedores?
Al detener con Ctrl+C, los contenedores salen.
Los volúmenes permanecen visibles en Docker Desktop y conservan su contenido.
Ventaja: puedes reiniciar servicios sin perder la información guardada.
Habilidades y conceptos practicados:
Configurar volúmenes bind y volúmenes nombrados en Docker Compose.
Montar rutas clave: /usr/share/nginx/html para NGINX y /var/lib/mysql para MySQL.
Validar estado con docker volume ls y explorar archivos desde Docker Desktop.
Editar index.html local y ver cambios en localhost tras un refresh.
¿Quieres compartir cómo montas tus volúmenes o qué rutas usas para tus servicios? Deja tus dudas y experiencias en los comentarios.
en macOS Sequoia Versión 15.2 cuando ejecuté el comando docker compose up me saltó el siguiente error:
para solventar este error tube que actualizar mi archivo docker-compose.yml:
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
app:
image: gagandaka/websiteplatzi:latest
volumes:
- app_data:/app/data
db:
image: mysql:5.7
platform: linux/amd64
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
app_data:
db_data:
Es bueno ver estos errores reales, ya que nos ayudan a entenderlos mejor, y gracias por la solución, va de la mano con las clases de multiplataforma
en caso de dbdata y appdata, en donde guarda docker estos volumenes en caso de que se borren los contenedores?
ya que a diferencia de la carpeta html, estos directorios no se encuentran en ~docker-avanzado/Volumenes
Siempre pensé que se debía bajar y volver a subir para actualizar los cambios 🥲🥲🥲
Otra práctica es usando docker compose watch, es una configuración que puedes usarla para sincronizar cambios en archivos
Si tengo un volumen de tipo: bind, lo que tengo es un enlace en tiempo real con una carpeta de mi computadora, pero y si TAMBIEN, quiero un volumen nombrado para el mismo servicio, ¿cómo podría hacerlo?
Hola Miguel. ¡Es totalmente posible! Puedes combinar ambos tipos de volúmenes en la misma configuración de un servicio dentro de tu archivo docker-compose.yml.
Simplemente debes listar ambos bajo la sección volumes de tu servicio. Docker los tratará como dos puntos de montaje distintos dentro del mismo contenedor.
De esta forma, mantienes la sincronización en tiempo real con tu carpeta local y, al mismo tiempo, delegas la persistencia de datos críticos (como bases de datos) al sistema de gestión de volúmenes de Docker.