Ir al contenido
angel.library

Por qué se pierden los datos y cómo evitarlo

Ventana de terminal
docker run -d --name mi-db -e POSTGRES_PASSWORD=secreto postgres:16
# ... trabajas, creas tablas, cargas datos ...
docker rm -f mi-db
docker run -d --name mi-db -e POSTGRES_PASSWORD=secreto postgres:16
# la base de datos está vacía otra vez

Sin un volumen, todo lo que Postgres escribe vive en la capa de escritura del contenedor (ver Arquitectura) — al borrar el contenedor, esa capa desaparece con él. El segundo docker run crea un contenedor nuevo, sin ninguna relación con los datos del anterior, aunque use el mismo nombre e imagen.

Ventana de terminal
docker run -d --name mi-db \
-e POSTGRES_PASSWORD=secreto \
-v datos-postgres:/var/lib/postgresql/data \
postgres:16

Ahora los datos viven en el volumen datos-postgres, que existe independiente del contenedor. Aunque se borre el contenedor con docker rm -f mi-db, el volumen sigue existiendo:

Ventana de terminal
docker rm -f mi-db
docker run -d --name mi-db \
-e POSTGRES_PASSWORD=secreto \
-v datos-postgres:/var/lib/postgresql/data \
postgres:16
# los datos siguen ahí — el nuevo contenedor se monta sobre el mismo volumen
Contenedor = el proceso, desechable, se recrea en segundos
Volumen = los datos, persistente, sobrevive al contenedor

Un contenedor de base de datos se puede borrar y recrear libremente (por ejemplo, para actualizar a una versión nueva de la imagen) sin miedo a perder nada, siempre que los datos estén en un volumen. El contenedor en sí no debería tratarse como “donde viven los datos” — es solo el proceso que los sirve.

Cómo saber si un contenedor tiene sus datos en volumen

Sección titulada «Cómo saber si un contenedor tiene sus datos en volumen»
Ventana de terminal
docker inspect --format '{{json .Mounts}}' mi-db

Si la lista está vacía, ese contenedor no tiene ningún volumen — cualquier dato ahí es efímero.

A veces sí se quiere empezar de cero (por ejemplo, para probar un schema desde cero):

Ventana de terminal
docker rm -f mi-db
docker volume rm datos-postgres
docker run -d --name mi-db -e POSTGRES_PASSWORD=secreto -v datos-postgres:/var/lib/postgresql/data postgres:16

Borrar el volumen explícitamente (docker volume rm) es lo que de verdad resetea los datos — borrar solo el contenedor, no.

  • Este es el error de Docker más común al empezar — perder datos “sin querer” casi siempre es este mismo patrón: correr algo sin -v pensando que persistía solo.
  • Ver Levantar Postgres con docker run para el comando completo recomendado, con volumen incluido desde el principio.