Descripción general
La aplicación se compone de tres servicios orquestados por Docker Compose:| Servicio | Nombre del contenedor | Imagen / Build | Puerto expuesto | Descripción |
|---|---|---|---|---|
db | perecederos-db | postgres:15 | 5432:5432 | Base de datos PostgreSQL |
backend | perecederos-backend | Build desde ./backend | 8080:8080 | API REST en Spring Boot (Java 17) |
frontend | perecederos-frontend | Build desde ./frontend-vite | 3000:80 | Aplicación React servida por Nginx |
El contenedor
frontend depende de backend (depends_on). Docker Compose garantiza que el backend se inicie antes de arrancar el frontend.Requisitos previos
- Docker Engine 24 o superior
- Docker Compose v2 (incluido en Docker Desktop y en
docker-compose-plugin)
Inicio rápido
Construye y levanta los servicios
Detener y reiniciar servicios
Ver registros (logs)
Detalles de cada servicio
Base de datos (db)
Usa la imagen oficial
postgres:15. Las credenciales y el nombre de la base de datos se configuran mediante variables de entorno en docker-compose.yml. El puerto 5432 queda expuesto en el host para conexiones directas con herramientas como psql o DBeaver.Backend (backend)
Se construye en dos etapas: primero Maven compila el JAR con
eclipse-temurin:17, luego el artefacto se copia a una imagen de runtime más ligera. Escucha en el puerto 8080 y se conecta a la base de datos usando host.docker.internal para alcanzar el servicio db del host.Frontend (frontend)
Se construye con Node 18 y Vite, y el resultado estático se sirve con Nginx Alpine. El puerto interno
80 se mapea al 3000 del host. Nginx actúa además como proxy inverso: las peticiones a /api/ se redirigen automáticamente al backend.Red interna
Todos los contenedores comparten la red por defecto creada por Docker Compose. El frontend se comunica con el backend usando el nombre de servicio
backend como hostname (http://backend:8080).Solución de problemas frecuentes
El backend falla con 'Connection refused' al arrancar
El backend falla con 'Connection refused' al arrancar
El backend intenta conectarse a la base de datos durante el inicio. Si la base de datos aún no está lista, el pool de conexiones agota el tiempo de espera. Esto puede ocurrir la primera vez que se levanta el stack.Solución: Vuelve a iniciar solo el backend tras unos segundos:El
docker-compose.yml no incluye un healthcheck en el servicio db, por lo que depends_on no garantiza que PostgreSQL esté aceptando conexiones, solo que el contenedor haya arrancado.El puerto 8080 o 3000 ya está en uso
El puerto 8080 o 3000 ya está en uso
Otro proceso en el host ocupa el puerto. Identifícalo y detenlo, o cambia el mapeo de puertos en
docker-compose.yml (ver Configuración de puertos).Los cambios en el código no se reflejan al relanzar
Los cambios en el código no se reflejan al relanzar
Sin la opción
--build, Docker Compose reutiliza las imágenes existentes. Fuerza la reconstrucción:La base de datos no persiste los datos entre reinicios
La base de datos no persiste los datos entre reinicios
El
docker-compose.yml actual no define un volumen nombrado para PostgreSQL. Los datos se almacenan en una capa de escritura del contenedor y se pierden con docker-compose down.Para persistir los datos, agrega un volumen en docker-compose.yml: