
Con Docker se puede tener PostgreSQL funcionando en el ordenador sin instalarlo en el sistema: un solo fichero describe la base de datos y la consola pgAdmin, se arranca con un comando y se borra sin dejar rastro. Esta guía lo monta paso a paso, con los comandos y las salidas tal como se ven en pantalla.
En resumen: crea una carpeta con el fichero docker-compose.yml de esta guía, ejecuta docker compose up -d y tendrás PostgreSQL en localhost:5432 y pgAdmin en http://localhost:5050. Los datos se guardan en un volumen y sobreviven aunque pares o borres los contenedores.
Probado el 26 de octubre de 2026 con PostgreSQL 18.6, pgAdmin 9.18, Docker 28.5.1 y Docker Compose 2.40, en Docker Desktop. Los comandos son los mismos en Windows, macOS y Linux.
Qué necesitas
- Docker instalado. En Windows y macOS, Docker Desktop; en Linux, Docker Engine con el complemento Compose. Las instrucciones oficiales están en docs.docker.com.
- Una terminal: PowerShell o Terminal de Windows, la Terminal de macOS o la de tu distribución Linux.
- Los puertos 5432 y 5050 libres. Si ya tienes un PostgreSQL instalado, mira el apartado de problemas frecuentes.
Para comprobar que Docker funciona:
docker --version docker compose version
Tienen que responder con su versión, por ejemplo Docker version 28.5.1 y Docker Compose version v2.40.2.
Paso 1. Crea la carpeta y el fichero docker-compose.yml
Crea una carpeta para el proyecto, por ejemplo postgres-docker, y dentro un fichero llamado docker-compose.yml con este contenido:
services:
postgres:
image: postgres:18
container_name: postgres
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: cambia-esta-clave
POSTGRES_DB: tienda
ports:
- "127.0.0.1:5432:5432"
volumes:
- datos-postgres:/var/lib/postgresql
restart: unless-stopped
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@ejemplo.com
PGADMIN_DEFAULT_PASSWORD: cambia-esta-clave
ports:
- "127.0.0.1:5050:80"
depends_on:
- postgres
restart: unless-stopped
volumes:
datos-postgres:
Qué hace cada parte:
| Línea | Para qué sirve |
|---|---|
image: postgres:18 |
La imagen oficial de PostgreSQL, versión mayor 18. Docker descarga la última versión menor de esa rama. |
POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB |
El usuario administrador, su contraseña y la base de datos que se crean la primera vez que arranca. Cambia la contraseña por una propia. |
"127.0.0.1:5432:5432" |
Publica el puerto 5432 solo en tu ordenador. Sin el 127.0.0.1, cualquier equipo de tu red podría intentar conectarse. |
datos-postgres:/var/lib/postgresql |
Guarda los datos en un volumen de Docker, fuera del contenedor. En la versión 18 la imagen oficial guarda los datos bajo esta ruta; en versiones anteriores era /var/lib/postgresql/data. |
pgadmin |
La consola web de administración de PostgreSQL, con el usuario y la contraseña con los que entrarás en ella. |
restart: unless-stopped |
Vuelve a arrancar los contenedores al reiniciar Docker, salvo que los hayas parado tú. |
Paso 2. Arranca los contenedores
Desde la carpeta del proyecto:
docker compose up -d
La primera vez tarda algo más porque descarga las imágenes. Después, comprueba que los dos contenedores están en marcha:
docker compose ps NAME IMAGE STATUS PORTS pgadmin dpage/pgadmin4 Up 9 seconds 127.0.0.1:5050->80/tcp postgres postgres:18 Up 11 seconds 127.0.0.1:5432->5432/tcp
Paso 3. Comprueba que PostgreSQL responde
En el registro del contenedor tiene que aparecer que la base de datos está lista:
docker compose logs postgres ... LOG: database system is ready to accept connections
Y puedes conectarte con psql, el cliente de línea de comandos que viene dentro del contenedor:
docker compose exec postgres psql -U admin -d tienda -c "SELECT version();"
version
--------------------------------------------------------------------------------------------
PostgreSQL 18.6 (Debian 18.6-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc ...
(1 row)
Paso 4. Crea una tabla de ejemplo
Guarda estas sentencias en un fichero ejemplo.sql dentro de la carpeta del proyecto:
CREATE TABLE clientes (
id serial PRIMARY KEY,
nombre text NOT NULL,
ciudad text NOT NULL,
alta date NOT NULL DEFAULT current_date
);
INSERT INTO clientes (nombre, ciudad) VALUES
('Ana García', 'Madrid'),
('Jordi Puig', 'Barcelona'),
('Lucía Pérez', 'Valencia');
SELECT id, nombre, ciudad FROM clientes ORDER BY id;
Y ejecútalas en la base de datos tienda:
docker compose exec -T postgres psql -U admin -d tienda < ejemplo.sql CREATE TABLE INSERT 0 3 id | nombre | ciudad ----+-------------+----------- 1 | Ana García | Madrid 2 | Jordi Puig | Barcelona 3 | Lucía Pérez | Valencia (3 rows)
El -T hace falta porque el contenido llega desde un fichero y no desde el teclado.
Paso 5. Entra en pgAdmin y registra el servidor
Abre http://localhost:5050 en el navegador y entra con el correo y la contraseña de PGADMIN_DEFAULT_EMAIL y PGADMIN_DEFAULT_PASSWORD:
pgAdmin no conoce todavía tu servidor. Pulsa Add New Server en el panel de inicio y rellena:
- En la pestaña General, un nombre cualquiera, por ejemplo Dataprix local.
- En la pestaña Connection: Host name/address
postgres, Port5432, Usernameadminy la contraseña dePOSTGRES_PASSWORD.
El host es postgres, no localhost. pgAdmin corre en su propio contenedor, y para él localhost es ese contenedor. Dentro de la red que crea Docker Compose, cada servicio se alcanza por su nombre.
Al guardar, el servidor aparece en el árbol de la izquierda. Despliega Databases › tienda › Schemas › public › Tables y verás la tabla clientes. Con Tools › Query Tool puedes escribir consultas y ejecutarlas con F5:
Paso 6. Conéctate desde tus aplicaciones
Las aplicaciones que corren en tu ordenador se conectan a localhost, porque el puerto está publicado ahí:
| Host | localhost |
| Puerto | 5432 |
| Base de datos | tienda |
| Usuario | admin |
| Cadena de conexión | postgresql://admin:cambia-esta-clave@localhost:5432/tienda |
Si la aplicación también va en un contenedor del mismo docker-compose.yml, usa como host postgres, igual que pgAdmin.
Paso 7. Parar, arrancar y borrar
Los datos viven en el volumen datos-postgres, no en el contenedor. Puedes parar y borrar los contenedores sin perderlos:
docker compose down
docker compose up -d
docker compose exec postgres psql -U admin -d tienda -c "SELECT count(*) FROM clientes;"
count
-------
3
(1 row)
Para parar sin borrar los contenedores, docker compose stop, y para volver a arrancarlos, docker compose start.
Cuidado con docker compose down -v: la opción -v borra también el volumen, y con él todas las bases de datos. Úsala solo cuando quieras empezar de cero.
Problemas frecuentes
El puerto 5432 ya está en uso
Suele pasar si ya hay un PostgreSQL instalado en el sistema. Cambia el puerto de tu lado en el docker-compose.yml, por ejemplo a "127.0.0.1:5433:5432", y conéctate a localhost:5433. pgAdmin sigue usando postgres y 5432, porque habla con el contenedor por dentro de la red de Docker.
He cambiado la contraseña y no funciona
POSTGRES_USER, POSTGRES_PASSWORD y POSTGRES_DB solo se aplican la primera vez, cuando el volumen está vacío. Después, la contraseña se cambia desde la propia base de datos, con ALTER USER admin PASSWORD '…';, o borrando el volumen si no hay nada que conservar.
pgAdmin dice que no puede conectar con el servidor
Casi siempre es el host: tiene que ser postgres, el nombre del servicio, y no localhost. Comprueba también que el contenedor de PostgreSQL está en marcha con docker compose ps.
En Windows, Docker Desktop no arranca
Docker Desktop para Windows funciona sobre WSL 2. Si no está activado, el propio instalador lo indica; la documentación oficial de Docker explica cómo activarlo.
Antes de usarlo en serio
Este montaje está pensado para desarrollo, pruebas y aprendizaje en tu propio ordenador. Para un servidor compartido o en producción conviene, como mínimo, poner contraseñas robustas guardadas fuera del fichero, no exponer los puertos a la red, programar copias de seguridad con pg_dump y fijar una versión concreta de la imagen para que las actualizaciones no lleguen por sorpresa.
Para seguir
- Ficha de PostgreSQL: qué es, licencia, arquitectura, alternativas y versiones con soporte.
- Radar de versiones de PostgreSQL: hasta cuándo recibe parches cada versión.
- Ranking completo de plataformas de datos de Dataprix.
Contenido elaborado con asistencia de inteligencia artificial — Equipo Editorial Dataprix. Verifica la información antes de tomar decisiones.
