6. Creación contenedores nginx, Localstack,

 

6: Creación de Contenedores con Docker (Nginx, LocalStack, PostgreSQL, phpPgAdmin y Vite)

Duración estimada: 25 minutos (más tiempo de espera según conexión)


6.1 Introducción

En este tutorial vamos a levantar nuestro entorno de desarrollo completo utilizando Docker. Esto nos permitirá tener un ambiente consistente y aislado con todos los servicios que necesitamos para nuestro proyecto.


6.2 ¿Qué servicios vamos a levantar?

📦 Contenedores incluidos en nuestra arquitectura:

ServicioPropósitoPuerto
NginxServidor web y proxy inverso80, 443
PostgreSQLBase de datos relacional5432
phpPgAdminAdministrador visual de PostgreSQL8080
LocalStackEmulación de servicios AWS (S3)4566
ViteServidor de desarrollo para assets5173
PHP-FPMProcesador de PHP9000

6.3 Requisitos Previos

🛠️ Verifica que tienes instalado:

bash
# Verificar Docker
docker --version
# Ejemplo: Docker version 28.0.0

# Verificar Docker Compose
docker-compose --version
# Ejemplo: Docker Compose version v2.24.0

# Verificar Node.js
node --version
# Ejemplo: v20.11.0

# Verificar NPM
npm --version
# Ejemplo: 10.2.4

⚠️ Importante: Node.js 20+ es necesario para que Inertia y Vite funcionen correctamente con la orquestación de Docker.


6.4 Levantando los Contenedores

🚀 Comandos para iniciar el entorno

Opción 1: Construcción y levantamiento completo (Recomendado para primera vez)

bash
# Detener contenedores existentes y reconstruir todo
docker compose down && docker compose up --build -d

Opción 2: Solo levantamiento (si ya construiste antes)

bash
# Levantar los contenedores en segundo plano
docker compose up -d

Opción 3: Con modo de desarrollo (para ver logs en tiempo real)

bash
# Levantar mostrando los logs en la terminal
docker compose up --build

🔍 Explicación de las banderas:

BandaSignificadoUso
--buildReconstruir las imágenesCuando hay cambios en Dockerfile
-dModo detached (segundo plano)Para que no bloquee la terminal
--no-cacheSin caché de construcciónCuando hay problemas de caché

6.5 Estructura del docker-compose.yml

📄 Archivo de configuración principal:

yaml
version: '3.8'

services:
  # 1. Servidor Web
  nginx:
    build:
      context: .
      dockerfile: .docker/nginx/Dockerfile
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html
    depends_on:
      - app
      - postgres
      - localstack

  # 2. Procesador PHP con Laravel
  app:
    build:
      context: .
      dockerfile: .docker/php/Dockerfile
    volumes:
      - ./:/var/www/html
    environment:
      - DB_HOST=postgres
      - DB_DATABASE=laravel
      - DB_USERNAME=laravel
      - DB_PASSWORD=secret

  # 3. Base de Datos PostgreSQL
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: laravel
      POSTGRES_USER: laravel
      POSTGRES_PASSWORD: secret
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  # 4. Administrador de PostgreSQL (phpPgAdmin)
  phppgadmin:
    image: dockage/phppgadmin:latest
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_USER: laravel
      POSTGRES_PASSWORD: secret
    ports:
      - "8080:80"
    depends_on:
      - postgres

  # 5. Emulador de AWS
  localstack:
    image: localstack/localstack:latest
    environment:
      - SERVICES=s3
      - AWS_DEFAULT_REGION=us-east-1
      - EDGE_PORT=4566
    ports:
      - "4566:4566"
    volumes:
      - localstack_data:/var/lib/localstack

  # 6. Servidor de Desarrollo Vite
  vite:
    build:
      context: .
      dockerfile: .docker/vite/Dockerfile
    ports:
      - "5173:5173"
    volumes:
      - ./:/var/www/html
    command: npm run dev

volumes:
  postgres_data:
  localstack_data:

6.6 ¿Qué está pasando en cada contenedor?

🔹 1. Nginx (Servidor Web)

  • Función: Recibe peticiones HTTP y las redirige a PHP-FPM

  • Archivos estáticos: Sirve CSS, JS, imágenes

  • Configuración: .docker/nginx/default.conf

🔹 2. PHP-FPM (Aplicación Laravel)

  • Función: Procesa el código PHP de Laravel

  • Framework: Laravel 11

  • Extensiones: pdo_pgsql, pdo_mysql, mbstring, etc.

🔹 3. PostgreSQL (Base de Datos)

  • Función: Almacenar datos de la aplicación

  • Credenciales por defecto:

    • Base de datos: laravel

    • Usuario: laravel

    • Contraseña: secret

🔹 4. phpPgAdmin (Gestor de Base de Datos)

  • Función: Acceso visual a la base de datos

  • Acceso: http://localhost:8080

  • Ventaja: Similar a phpMyAdmin pero para PostgreSQL

🔹 5. LocalStack (Emulador AWS)

  • Función: Emular servicios de AWS localmente

  • Servicios disponibles: S3 (por ahora)

  • Ventaja: Desarrollo sin costos en la nube

🔹 6. Vite (Desarrollo Frontend)

  • Función: Servir y compilar assets de React/JS

  • Hot Reload: Recarga automática al guardar cambios

  • Puerto: 5173


6.7 Flujo de Trabajo del Entorno


6.8 Tiempos de Construcción

⏱️ ¿Cuánto tarda?

EtapaTiempo estimadoDepende de
Descarga de imágenes2-10 minutosVelocidad de internet
Construcción de imágenes1-3 minutosCPU del equipo
Inicio de contenedores30 segundosRAM/SSD

💡 Consejo: Mientras esperas, este es un buen momento para preparar un café ☕ o revisar la documentación del proyecto.


6.9 Verificación de Contenedores

📋 Comandos útiles para verificar el estado:

bash
# Ver contenedores en ejecución
docker compose ps

# Ver logs en tiempo real
docker compose logs -f

# Ver logs de un servicio específico
docker compose logs app
docker compose logs postgres

# Acceder a la terminal de un contenedor
docker compose exec app bash
docker compose exec postgres psql -U laravel

✅ Checklist de verificación:

  • nginx está ejecutándose

  • app (PHP-FPM) está ejecutándose

  • postgres está ejecutándose

  • phppgadmin está ejecutándose

  • localstack está ejecutándose

  • vite está ejecutándose


6.10 Acceso a los Servicios

🌐 URLs y credenciales:

ServicioURLCredenciales
Aplicaciónhttp://localhost-
phpPgAdminhttp://localhost:8080Usuario: laravel
Contraseña: secret
APIhttp://localhost/api-
Vitehttp://localhost:5173-
LocalStack S3http://localhost:4566-

6.11 Posibles Errores y Soluciones

❌ Error: "Port is already allocated"

bash
# Solución: Cambiar el puerto en docker-compose.yml
ports:
  - "8081:80"  # Cambiar el puerto izquierdo

❌ Error: "Cannot connect to Docker daemon"

bash
# En Linux
sudo systemctl start docker

# En Windows/Mac
# Reiniciar Docker Desktop

❌ Error: "Docker build failed"

bash
# Limpiar caché y reconstruir
docker compose build --no-cache
docker compose up -d

❌ Error: "LocalStack service not starting"

bash
# Aumentar memoria asignada a Docker
# En Docker Desktop -> Settings -> Resources
# Asignar al menos 4GB de RAM

6.12 Comandos Útiles para el Día a Día

🛠️ Recetario de comandos:

bash
# Iniciar el entorno
docker compose up -d

# Detener el entorno
docker compose down

# Reiniciar un servicio específico
docker compose restart app

# Ver logs de todos los servicios
docker compose logs -f

# Limpiar todo y empezar de cero
docker compose down -v && docker compose up --build -d

# Ejecutar comandos de Laravel dentro del contenedor
docker compose exec app php artisan migrate
docker compose exec app php artisan tinker

# Acceder a PostgreSQL
docker compose exec postgres psql -U laravel -d laravel

📝 Ejercicio de la Clase

Para practicar lo aprendido:

  1. Levanta los contenedores con el comando proporcionado

  2. Verifica que todos los servicios estén en ejecución

  3. Accede a phpPgAdmin y verifica la conexión

  4. Explora los logs de cada contenedor

  5. Prueba detener e iniciar los servicios


📚 Recursos Adicionales


¡Excelente! Has levantado tu entorno de desarrollo. Continúa al Tutorial 7: Configuración de Variables de Entorno y Dependencias

Comentarios