Ir al contenido
angel.library

Levantar Postgres con docker run

Requiere Docker Engine activo y el puerto 5432 disponible. El bloque multilínea usa Bash/zsh; en PowerShell escríbelo en una sola línea o utiliza su carácter de continuación. La contraseña mostrada es solo para un laboratorio local.

Ventana de terminal
docker run -d \
--name mi-postgres \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=secreto \
-e POSTGRES_DB=miapp \
-p 127.0.0.1:5432:5432 \
-v datos-postgres:/var/lib/postgresql/data \
postgres:16

Esto levanta Postgres 16 en segundo plano, con un usuario, contraseña y base de datos ya creados, accesible en localhost:5432, y con los datos guardados en un volumen que sobrevive a docker rm (ver Persistencia de datos para el porqué del -v).

Las variables de entorno de la imagen oficial

Sección titulada «Las variables de entorno de la imagen oficial»
VariablePara qué
POSTGRES_USERUsuario que se crea (default: postgres)
POSTGRES_PASSWORDObligatoria — la imagen no arranca sin ella
POSTGRES_DBBase de datos que se crea al primer arranque (default: igual al POSTGRES_USER)

Estas variables solo tienen efecto la primera vez que el contenedor arranca con un volumen vacío — si ya existe un volumen con datos, la imagen no vuelve a aplicar estas variables (no resetea usuario/contraseña en cada arranque).

Ventana de terminal
-v datos-postgres:/var/lib/postgresql/data

En la imagen postgres:16, monta /var/lib/postgresql/data. Sin un volumen nombrado, la imagen puede crear un volumen anónimo: eliminar el contenedor no siempre elimina ese volumen, pero un contenedor nuevo no lo reutiliza automáticamente. Un nombre estable facilita reconectar los datos; no es un backup. Revisa la ruta documentada antes de cambiar de versión principal.

Ventana de terminal
docker ps
docker logs mi-postgres

En los logs, la línea database system is ready to accept connections confirma que Postgres terminó de arrancar y ya acepta conexiones.

Ventana de terminal
docker run ... postgres:16 # una versión mayor específica — recomendado
docker run ... postgres:16.4 # versión exacta — más reproducible aún
docker run ... postgres # = postgres:latest, evitar en proyectos reales (ver Build y tags)

Fijar al menos la versión mayor (postgres:16) evita sorpresas si en algún momento se hace docker pull postgres de nuevo y trae una versión mayor distinta con cambios incompatibles.

  • Para uso diario en un proyecto real, el patrón recomendado es declarar esto en un docker-compose.yml en vez de repetir el comando largo cada vez — ver Postgres con Compose.
  • -p 5432:5432 solo hace falta si quieres conectarte desde afuera de Docker (un cliente en tu máquina, o la app corriendo nativa) — si la app que consume esta base de datos también corre en un contenedor en la misma red, no hace falta publicar el puerto (ver Redes).

Crea una tabla y una fila de prueba con la guía de conexión, reinicia con docker restart mi-postgres y vuelve a consultarla. La fila debe seguir allí. Para una prueba de recreación, conserva y vuelve a montar el mismo volumen; no ejecutes docker volume rm sobre los datos que quieres conservar.