18. Multiples instancias de Postgres

 docker --version

 docker run --name postgres-beta -d -p 5433:5432 -e POSTGRES_PASSWORD=mypass1 postgres:14-alpine3.17

Múltiples Instancias de PostgreSQL con Docker

📚 Introducción

¿Qué es una instancia de PostgreSQL?

Una instancia es una copia ejecutándose del servidor de PostgreSQL. Imagina que es como tener:

  • Varias cocinas en un mismo restaurante

  • Múltiples motores en un mismo automóvil

  • Varios hornos en una misma panadería

Cada instancia funciona independientemente, aunque estén en la misma computadora.

¿Para qué sirve tener múltiples instancias?

text
┌─────────────────────────────────────────────────────────┐
│                     TU COMPUTADORA                       │
├─────────────────┬─────────────────┬─────────────────┤
│   PostgreSQL    │   PostgreSQL    │   PostgreSQL    │
│    Versión 15   │    Versión 14   │    Versión 13   │
│   Puerto 5432   │   Puerto 5433   │   Puerto 5434   │
├─────────────────┴─────────────────┴─────────────────┤
│                 Sistema Operativo                    │
└─────────────────────────────────────────────────────────┘

Casos de uso reales:

  • 🔬 Pruebas: Probar cambios sin afectar la base de datos principal

  • 🔄 Migraciones: Verificar que una nueva versión funcione con tus datos

  • 🎯 Desarrollo: Diferentes versiones para diferentes proyectos

  • 🧪 Experimentación: Probar configuraciones sin riesgo

🚀 Instalando la Primera Instancia

Comando básico para crear un contenedor:

bash
docker container run \
  --name postgres-alpha \
  -e POSTGRES_PASSWORD=mi-pass-1 \
  -p 5432:5432 \
  -d postgres:latest

Explicación del comando:

text
┌───────────────┬────────────────────────────────────────────┐
│   Parámetro   │                Descripción                 │
├───────────────┼────────────────────────────────────────────┤
│ --name        │ Nombre único para identificar el contenedor│
│ -e            │ Variables de entorno (configuraciones)     │
│ -p            │ Mapeo de puertos: HOST:CONTENEDOR          │
│ -d            │ Ejecutar en segundo plano (detached)       │
│ postgres:latest│ Imagen de Docker a usar                  │
└───────────────┴────────────────────────────────────────────┘

Diagrama del mapeo de puertos:

text
┌──────────────────────────────────────────────────┐
│          TU COMPUTADORA (localhost)              │
│                ┌─────────────────┐               │
│ Puerto 5432 ───►   PostgreSQL    │               │
│                │   Contenedor    │               │
│                │   Puerto 5432   │               │
│                └─────────────────┘               │
└──────────────────────────────────────────────────┘

Analogía: Imagina que tu computadora es un edificio de apartamentos. Cada puerto (5432, 5433) es como el número de apartamento. PostgreSQL es el inquilino que vive en ese apartamento específico.

🎯 Especificando Versiones

¿Por qué usar versiones específicas?

bash
# ❌ NO RECOMENDADO - Puede cambiar sin aviso
docker container run --name postgres1 -d postgres

# ✅ RECOMENDADO - Versión específica
docker container run --name postgres1 -d postgres:14-alpine3.17

Versión = Estabilidad

text
postgres:14-alpine3.17
        │    │
        │    └───▶ Versión de Linux (más pequeña)
        └────────▶ Versión de PostgreSQL

🏗️ Creando la Segunda Instancia

Paso 1: Ver contenedores existentes

bash
docker container ls

Paso 2: Crear segunda instancia

bash
docker container run \
  --name postgres-beta \
  -e POSTGRES_PASSWORD=mi-pass-2 \
  -p 5433:5432 \
  -d postgres:14-alpine3.17

Diagrama de dos instancias:

text
┌──────────────────────────────────────────────────┐
│          TU COMPUTADORA (localhost)              │
├──────────────────────────────────────────────────┤
│ Puerto 5432 ───► PostgreSQL Alpha (Versión 15)   │
│ Puerto 5433 ───► PostgreSQL Beta  (Versión 14)   │
└──────────────────────────────────────────────────┘

⚠️ Solución de Problemas Comunes

Error 1: Nombre ya existe

bash
# Error: Container with name 'postgres-alpha' already exists
# Solución 1: Usar otro nombre
docker container run --name postgres-beta ...

# Solución 2: Eliminar el contenedor existente
docker container rm postgres-alpha

Error 2: Puerto ya en uso

bash
# Error: Port 5432 is already allocated
# Solución: Usar otro puerto
docker container run -p 5433:5432 ...

Error 3: Contenedor detenido pero aún existe

bash
# Ver TODOS los contenedores (incluyendo detenidos)
docker container ls -a

# Resultado:
CONTAINER ID   STATUS     NAMES
abc123         Exited     postgres-alpha
def456         Running    postgres-beta

🛠️ Comandos Esenciales de Gestión

Ver contenedores activos:

bash
docker container ls

Ver TODOS los contenedores:

bash
docker container ls -a

Detener contenedores:

bash
# Detener uno
docker container stop nombre-contenedor

# Detener varios
docker container stop alpha beta gamma

Eliminar contenedores:

bash
# Eliminar uno
docker container rm nombre-contenedor

# Eliminar varios
docker container rm alpha beta

# Eliminar forzadamente (si está corriendo)
docker container rm -f nombre-contenedor

Iniciar contenedores existentes:

bash
docker container start nombre-contenedor

📊 Conexión a las Instancias

Configuración de conexión:

text
┌─────────────────┬─────────────────┬─────────────────┐
│     Parámetro   │    Instancia 1  │    Instancia 2  │
├─────────────────┼─────────────────┼─────────────────┤
│ Host            │ localhost       │ localhost       │
│ Puerto          │ 5432            │ 5433            │
│ Usuario         │ postgres        │ postgres        │
│ Contraseña      │ mi-pass-1       │ mi-pass-2       │
│ Base de datos   │ postgres        │ postgres        │
└─────────────────┴─────────────────┴─────────────────┘

Ejemplo de conexión (usando psql):

bash
# Conectar a la primera instancia
psql -h localhost -p 5432 -U postgres

# Conectar a la segunda instancia  
psql -h localhost -p 5433 -U postgres

🧹 Limpieza Final

Ejercicio práctico:

  1. Detener ambas instancias

  2. Eliminar ambos contenedores

  3. Verificar que no queden contenedores

bash
# Opción 1: Paso a paso
docker container stop postgres-alpha postgres-beta
docker container rm postgres-alpha postgres-beta
docker container ls -a

# Opción 2: Usando IDs
docker container ls -a  # Ver IDs
docker container rm -f ID1 ID2  # Reemplazar ID1, ID2 con los IDs reales

📝 Cuestionario

Pregunta 1:

¿Qué significa el parámetro -p 5432:5432 en el comando de Docker?

text
A) Puerto del contenedor 5432, Puerto del host 5432
B) Puerto del host 5432, Puerto del contenedor 5432  
C) Ambos puertos son del host
D) Ambos puertos son del contenedor

Pregunta 2:

Si recibes el error "Port is already allocated", ¿qué debes hacer?

text
A) Reiniciar la computadora
B) Usar un puerto diferente en el host
C) Cambiar el puerto del contenedor
D) Esperar unos minutos

Pregunta 3:

¿Por qué es importante especificar la versión en postgres:14-alpine3.17?

text
A) Porque es más rápido
B) Para evitar cambios inesperados por actualizaciones automáticas
C) Porque ocupa menos espacio
D) Todas las anteriores

Pregunta 4:

¿Qué comando muestra TODOS los contenedores, incluyendo los detenidos?

text
A) docker container ls
B) docker container show
C) docker container ls -a
D) docker container list-all

Pregunta 5:

Si quieres conectar a dos instancias de PostgreSQL simultáneamente, ¿qué debe ser diferente?

text
A) El nombre del contenedor
B) El puerto del host
C) La contraseña
D) Todas las anteriores

Pregunta 6:

¿Qué hace el parámetro -d en docker container run?

text
A) Depura el contenedor
B) Ejecuta en segundo plano (detached)
C) Elimina el contenedor automáticamente
D) Descarga la imagen

Respuestas del Cuestionario:

  1. B) Puerto del host 5432, Puerto del contenedor 5432
    Formato: -p HOST:CONTENEDOR

  2. B) Usar un puerto diferente en el host
    Ejemplo: Cambiar de -p 5432:5432 a -p 5433:5432

  3. B) Para evitar cambios inesperados por actualizaciones automáticas
    Las versiones específicas garantizan consistencia

  4. C) docker container ls -a
    El flag -a muestra todos los contenedores

  5. D) Todas las anteriores
    Cada instancia necesita identificación única en todos los aspectos

  6. B) Ejecuta en segundo plano (detached)
    Permite que el contenedor corra sin bloquear la terminal


📌 Resumen de Buenas Prácticas

  1. Nombres descriptivos: Usa nombres como postgres-devpostgres-test

  2. Versiones específicas: Siempre especifica el tag de la imagen

  3. Puertos organizados: Usa rangos como 5432, 5433, 5434, etc.

  4. Contraseñas seguras: Diferentes contraseñas para cada instancia

  5. Documentación: Anota qué hace cada instancia

  6. Limpieza regular: Elimina contenedores que ya no uses

¡Felicitaciones! 🎉 Ahora puedes ejecutar múltiples instancias de PostgreSQL para desarrollo, pruebas y experimentación.

Comentarios

Entradas más populares de este blog

14. Publish and Detached modes

12. Hola Mundo en Docker.

11¿Qué es Docker? y ¿Por qué debo saberlo?