Cómo instalar PostgreSQL con Docker y pgAdmin, paso a paso

Cómo instalar PostgreSQL con Docker y pgAdmin, paso a paso

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:

Pantalla de inicio de sesión de pgAdmin 4 con el correo de administrador del docker-compose.yml
Inicio de sesión en pgAdmin 4. Captura de Dataprix.

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, Port 5432, Username admin y la contraseña de POSTGRES_PASSWORD.
Ventana Register - Server de pgAdmin, pestaña Connection, con el host postgres, el puerto 5432 y el usuario admin
Registro del servidor en pgAdmin: el host es el nombre del servicio del docker-compose.yml. Captura de Dataprix.

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:

Query Tool de pgAdmin con una consulta sobre la tabla clientes y sus tres filas en el resultado
Consulta sobre la tabla de ejemplo desde el Query Tool de pgAdmin. Captura de Dataprix.

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

Contenido elaborado con asistencia de inteligencia artificial — Equipo Editorial Dataprix. Verifica la información antes de tomar decisiones.