ver si esta ocupado el puerto 5432 a nivel root, sistema

sudo lsof -i :5432

desactivarlo:

sudo systemctl stop postgresql
sudo systemctl disable postgresql


instalar contenedor postgres en docker (descarga las imagenes a usar automaticamente):

primero crear un volumen:

docker volume create postgres_data


Los contenedores de Docker son efímeros (volátiles). Todo lo que escribas dentro de un contenedor desaparece en cuanto lo eliminas (docker rm).

¿Dónde se crea físicamente el volumen postgres_data?

Se crea en el disco duro de tu servidor Ubuntu, dentro de la ruta que Docker reserva para sus datos

 Docker se encarga de administrar una de esas carpetas por ti

En Docker existen dos formas principales de guardar datos en el disco de tu servidor: Volúmenes Administrados (volumenes) y Bind Mounts (mapear carpetas manuales)

cuando usarlo?

Bases de datos, almacenamiento interno y servicios donde no necesitas tocar los archivos directamente a mano

En una ruta gestionada por Docker (/var/lib/docker/…)

el mapeo sin volumen?

Páginas web, archivos de configuración o código que quieras editar fácilmente desde tu terminal o VS Code

¿Por qué se prefiere usar un Volumen (postgres_data) para PostgreSQL?

  1. Permisos de archivos automatizados: PostgreSQL necesita permisos muy estrictos de lectura/escritura sobre su carpeta.Docker se encarga automáticamente de configurar esos permisos en /var/lib/docker/volumes/…
  2. Mejor rendimiento: Los volúmenes administrados por Docker están optimizados para altas lecturas y escrituras en Linux.
  3. Comodidad: No tienes que preocuparte por crear carpetas con rutas absolutas o lidiar con permisos de usuario de Linux (chown/chmod)

¿Cómo comprobar que tus archivos están ahí físicamente?

Puedes ver los archivos de tu base de datos directamente en tu servidor Ubuntu ejecutando este comando con sudo:


luego de crear el volumen, podemos crear el contenedor postgres:

docker run -d   --name postgres_db   --restart always   -e POSTGRES_USER=admin   -e POSTGRES_PASSWORD=abc   -e POSTGRES_DB=mi_base_de_datos   -p 5432:5432   -v postgres_data:/var/lib/postgresql/data   postgres:16

Si te vas a conectar con un programa cliente desde tu PC (como DBeaver, pgAdmin local o DataGrip)

No está de más, es 100% necesario.

Si SOLO te vas a conectar desde Adminer (interfaz web para administrar postgres) (casi siempre se hace de forma remota con un túnel SSSH)(o desde otros contenedores en Docker)

-p 5432:5432 está de más.

Como Adminer y PostgreSQL están dentro de la misma red de Docker (mi-red), se comunican internamente.

No hay que exponer el puerto al servidor real ni a tu red local.

Esto es además más seguro, porque nadie en el exterior podrá intentar conectarse directamente a la base de datos

el comando real sería:

docker run -d \
  --name postgres_db \
  --network mi-red \
  --restart always \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=abc \
  -e POSTGRES_DB=mi_base_de_datos \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:16


el container es:

postgres_db

usuario y password:

admin y abc

nombre de la base de datos:

mi_base_de_datos

ejecutar postgres en modo interactivo:

docker exec -it postgres_db psql -U admin -d mi_base_de_datos

ver los logs en tiempo real (escuchar):

docker logs -f postgres_db

acceder remotamente a una web para configurar el postgres: