1.3 · Volúmenes: conservar los datos más allá de los contenedores

Nivel 1 · Contenedores: imágenes, volúmenes, redes

1.3Volúmenes: conservar los datos más allá de los contenedores

Objetivo: hacer que los datos sobrevivan a la eliminación de los contenedores gracias a los volúmenes.
Tiempo estimado: 13 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • El contenedor es efímero : todo lo que escribe en sí mismo muere con él (rm = todo perdido) — para una base, es inaceptable: se almacena fuera del contenedor.
  • Nombrado para los datos, bind para el código : -v pgdata:/var/lib/postgresql/data (volumen gestionado por Docker, portable) para los datos; -v ./site:/usr/share/nginx/html (carpeta de la máquina) para el código en dev.
  • La prueba que salva : eliminar el contenedor, relanzar sobre el mismo volumen — los datos deben estar ahí; docker volume ls inventaría, rm elimina (definitivo).

Minicaso conductor — Idir pierde (casi) una base

Idir lanzó la base de demostración sin volumen « para ir rápido ». Por la noche, elimina el contenedor para empezar limpio — y descubre que los datos de prueba introducidos por la tarde han desaparecido con él. Al día siguiente, relanza con -v pgdata:/var/lib/postgresql/data, recrea los datos, elimina el contenedor, relanza sobre el mismo volumen: todo está ahí. Ha convertido un susto en reflejo: datos = volumen nombrado, verificado con una prueba rm + relanzamiento antes de cada puesta en marcha seria.

Continuación del caso 1.1-1.2 — Idir pasa de los contenedores desechables a los datos que sobreviven.

1. El drama del contenedor efímero

Por defecto, todo lo que un contenedor escribe en sí mismo muere con él (rm = todo perdido). Para una base de datos, es inaceptable. La solución: almacenar fuera del contenedor, en un volumen gestionado por Docker o una carpeta montada de la máquina.

Cuidado con el falso amigo: stop no borra nada, rm borra todo lo no montado. Creer lo contrario es la pérdida de datos más clásica del nivel 1.

2. Volumen nombrado frente a bind mount

El volumen nombrado (-v pgdata:/var/lib/postgresql/data) lo almacena Docker, portable y respaldable: la elección para los datos. El bind mount (-v ./site:/usr/share/nginx/html) enlaza una carpeta de su máquina: la elección para el código en desarrollo (modifique un archivo, el contenedor lo ve al instante).

La trampa es la ruta interna equivocada: montar al lado del directorio donde la aplicación escribe de verdad es persistir vacío. Se verifica la ruta en la documentación de la imagen.

3. El reflejo que salva: probar la eliminación

La prueba de la verdad: elimine el contenedor, relance otro sobre el mismo volumen — los datos deben estar ahí. docker volume ls inventaría, docker volume rm elimina (cuidado, definitivo). Los volúmenes huérfanos se purgan con prune, con prudencia.

Idir lo ha hecho un ritual: ningún servicio de datos sale a demo sin haber pasado la prueba rm + relanzamiento.

Error frecuente de interpretación: « stop borra mis datos, y una carpeta montada al azar basta para salvarlos ». No en ambos sentidos: stop conserva todo (solo rm destruye), y un montaje en la ruta interna equivocada persiste vacío mientras la aplicación escribe en otro lado. Volumen nombrado en la buena ruta, luego prueba rm + relanzamiento para probarlo.
Datos persistentes El contenedor muere, el volumen sobrevive Contenedor efímero Todo lointerno muere en el rmVolumen nombrado Gestionadopor Docker, portableRelanzamiento idéntico Mismosdatos en el mismo volumen
El contenedor muere, el volumen sobrevive
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Constatar: Idir elimina su contenedor sin volumen y pierde sus datos — lo efímero castiga. 2) Montar: relanza con -v pgdata:/var/lib/postgresql/data, en la ruta documentada de la imagen. 3) Probar: rm del contenedor y relanzamiento sobre pgdata — los datos siguen ahí. Lección: sin -v, la misma secuencia lo borra todo; la prueba rm + relanzamiento es la única prueba que cuenta.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Postgres que sobrevive al rm

La base de Idir, antes y después: con volumen, nada se pierde.

docker run -d --name bdd -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data postgres:16.4
# ... créez des données ...
docker rm -f bdd
docker run -d --name bdd2 -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data postgres:16.4
# les données sont toujours là

Lectura: el volumen pgdata ha sobrevivido a la eliminación del contenedor.

Lección: sin -v, la misma secuencia lo habría borrado todo.

Vocabulario de la sección

Volumen nombrado
Espacio de almacenamiento gestionado por Docker, persistente fuera de los contenedores, portable y respaldable.

Ejemplo sencillo: pgdata conserva la base de Idir entre bdd y bdd2.

Lo que no es: un archivo escrito en el contenedor sin montaje.

Reflejo: datos = volumen nombrado.

Bind mount
Carpeta de la máquina montada tal cual en el contenedor; ideal para el código en desarrollo.

Ejemplo sencillo: -v ./site:/usr/share/nginx/html: Idir modifica, el contenedor lo ve al instante.

Lo que no es: un almacenamiento portable para una base de producción.

Reflejo: código dev = bind, datos prod = volumen nombrado.

Punto de montaje
La ruta interna donde aparece el volumen en el contenedor; debe ser aquella donde escribe la aplicación.

Ejemplo sencillo: /var/lib/postgresql/data para postgres:16.4.

Lo que no es: una carpeta cualquiera elegida al azar.

Reflejo: verificar la ruta en la doc de la imagen.

prune
Limpieza de los recursos sin usar, volúmenes huérfanos incluidos — eliminación definitiva.

Ejemplo sencillo: Idir purga los volúmenes de sus pruebas desechables, nunca pgdata.

Lo que no es: una papelera de la que se puede restaurar el contenido.

Reflejo: verificar la lista antes de todo prune.

En la práctica — En práctica — Probar la persistencia

  1. Lance postgres CON un volumen nombrado y cree una tabla.
  2. Elimine el contenedor (rm -f) sin tocar el volumen.
  3. Relance un contenedor sobre el mismo volumen y verifique la tabla.
  4. Repita la prueba SIN volumen: constate la pérdida.
No volverá a perder una base: el volumen es un reflejo.

Script listo para decir — proteger una base (30 s)

« Mis datos van en un volumen nombrado: -v pgdata:/var/lib/postgresql/data, en la ruta documentada de la imagen. Lo pruebo: elimino el contenedor, relanzo sobre el mismo volumen, los datos están ahí. Sin volumen, la misma secuencia lo borra todo. »

Para decir ejecutando el rm + relanzamiento en directo; mostrar la tabla siempre presente.

Modelo copiar-pegar — base persistente

docker run -d --name bdd \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16.4
# Preuve : docker rm -f bdd, relancer pareil en --name bdd2, vérifier.
# Jamais : docker volume rm pgdata (définitif) ni prune sans vérifier.

Base de Idir en demo

Como arriba: pgdata nombrado como el servicio, prueba rm + relanzamiento superada antes de mostrar nada al responsable.

Sitio web en dev

-v ./site:/usr/share/nginx/html: Idir edita sus páginas en su máquina, el contenedor Nginx las sirve al instante — bind mount, no volumen nombrado.

Recuperación tras el susto

Base lanzada sin volumen por error: crear el volumen, relanzar con -v, reintroducir — y grabar el reflejo « datos = volumen nombrado ».

Limpieza de pruebas

docker volume ls para inventariar, rm dirigido para los volúmenes de prueba, prune solo tras verificación — nunca sobre pgdata.

Prudencia: Un volumen eliminado (docker volume rm, o prune demasiado rápido) se pierde definitivamente: sin papelera. Antes de toda limpieza, liste (docker volume ls), identifique el volumen de cada servicio en actividad, y solo purgue los huérfanos verificados — nunca a ciegas en una máquina compartida.

✓ Buenas prácticas

  • Datos = volumen nombrado, código dev = bind mount.
  • Probar el rm + relanzamiento antes de creer.
  • Nombrar los volúmenes como los servicios (pgdata).

✗ Errores frecuentes

  • Creer que stop borra (no) y que rm guarda (no).
  • Montar en la ruta interna equivocada (datos al lado).
  • Purgar los volúmenes (prune) sin verificar.

Puntos clave

  • Sin volumen, rm = pérdida total.
  • Volumen nombrado para los datos, bind para el código.
  • La prueba rm + relanzamiento prueba la persistencia.
  • prune con prudencia: eliminación definitiva.

Desafío 48h — aplique mañana

Lance postgres con volumen nombrado, cree una tabla, haga rm -f + relanzamiento y verifique. Luego repita sin volumen: constate la pérdida — y no la olvide más.

Lista de salida de la sección
  • Monto un volumen nombrado para todo dato que cuente.
  • Distingo volumen nombrado (datos) y bind mount (código dev).
  • Pruebo la persistencia con rm + relanzamiento antes de un uso serio.
Autoevaluación 1-5: ¿cada contenedor de datos tiene su volumen nombrado en la buena ruta?¿he pasado la prueba rm + relanzamiento?

Preguntas frecuentes

¿Dónde están los volúmenes en mi disco?

En el espacio de Docker (docker volume inspect pgdata da la ruta). No se manipulan a mano: se pasa por contenedores o respaldos.

¿Bind mount o volumen para una base en prod?

Volumen nombrado: portable, respaldable, independiente del árbol de la máquina. El bind se reserva al dev y a los archivos de config.

Comprueba tu comprensión

Un contenedor postgres sin volumen se elimina (rm). ¿Qué pasa con sus datos?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos