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?
┌─────────────────────────────────────────────────────────┐
│ 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:
docker container run \
--name postgres-alpha \
-e POSTGRES_PASSWORD=mi-pass-1 \
-p 5432:5432 \
-d postgres:latestExplicación del comando:
┌───────────────┬────────────────────────────────────────────┐
│ 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:
┌──────────────────────────────────────────────────┐
│ 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?
# ❌ 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.17Versión = Estabilidad
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
docker container lsPaso 2: Crear segunda instancia
docker container run \
--name postgres-beta \
-e POSTGRES_PASSWORD=mi-pass-2 \
-p 5433:5432 \
-d postgres:14-alpine3.17Diagrama de dos instancias:
┌──────────────────────────────────────────────────┐
│ 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
# 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-alphaError 2: Puerto ya en uso
# 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
# 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:
docker container lsVer TODOS los contenedores:
docker container ls -aDetener contenedores:
# Detener uno
docker container stop nombre-contenedor
# Detener varios
docker container stop alpha beta gammaEliminar contenedores:
# Eliminar uno
docker container rm nombre-contenedor
# Eliminar varios
docker container rm alpha beta
# Eliminar forzadamente (si está corriendo)
docker container rm -f nombre-contenedorIniciar contenedores existentes:
docker container start nombre-contenedor📊 Conexión a las Instancias
Configuración de conexión:
┌─────────────────┬─────────────────┬─────────────────┐
│ 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):
# 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:
Detener ambas instancias
Eliminar ambos contenedores
Verificar que no queden contenedores
# 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?
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 contenedorPregunta 2:
Si recibes el error "Port is already allocated", ¿qué debes hacer?
A) Reiniciar la computadora
B) Usar un puerto diferente en el host
C) Cambiar el puerto del contenedor
D) Esperar unos minutosPregunta 3:
¿Por qué es importante especificar la versión en postgres:14-alpine3.17?
A) Porque es más rápido
B) Para evitar cambios inesperados por actualizaciones automáticas
C) Porque ocupa menos espacio
D) Todas las anterioresPregunta 4:
¿Qué comando muestra TODOS los contenedores, incluyendo los detenidos?
A) docker container ls
B) docker container show
C) docker container ls -a
D) docker container list-allPregunta 5:
Si quieres conectar a dos instancias de PostgreSQL simultáneamente, ¿qué debe ser diferente?
A) El nombre del contenedor
B) El puerto del host
C) La contraseña
D) Todas las anterioresPregunta 6:
¿Qué hace el parámetro -d en docker container run?
A) Depura el contenedor
B) Ejecuta en segundo plano (detached)
C) Elimina el contenedor automáticamente
D) Descarga la imagenRespuestas del Cuestionario:
B) Puerto del host 5432, Puerto del contenedor 5432
Formato:-p HOST:CONTENEDORB) Usar un puerto diferente en el host
Ejemplo: Cambiar de-p 5432:5432a-p 5433:5432B) Para evitar cambios inesperados por actualizaciones automáticas
Las versiones específicas garantizan consistenciaC) docker container ls -a
El flag-amuestra todos los contenedoresD) Todas las anteriores
Cada instancia necesita identificación única en todos los aspectosB) Ejecuta en segundo plano (detached)
Permite que el contenedor corra sin bloquear la terminal
📌 Resumen de Buenas Prácticas
Nombres descriptivos: Usa nombres como
postgres-dev,postgres-testVersiones específicas: Siempre especifica el tag de la imagen
Puertos organizados: Usa rangos como 5432, 5433, 5434, etc.
Contraseñas seguras: Diferentes contraseñas para cada instancia
Documentación: Anota qué hace cada instancia
Limpieza regular: Elimina contenedores que ya no uses
¡Felicitaciones! 🎉 Ahora puedes ejecutar múltiples instancias de PostgreSQL para desarrollo, pruebas y experimentación.
Comentarios
Publicar un comentario