Proyecto final
El objetivo es empaquetar una aplicacion web completa con API, PostgreSQL, Redis y Nginx. No busca sustituir el manual de Docker Compose, sino aplicar Docker en un escenario real.
Arquitectura
mermaid
flowchart LR
U["Browser"] --> N["Nginx"]
N --> F["Frontend estatico"]
N --> A["API"]
A --> P["PostgreSQL"]
A --> R["Redis"]
P --> V1["postgres_data volume"]
R --> V2["redis_data volume"]Estructura
txt
proyecto/
api/
Dockerfile
package.json
src/
frontend/
Dockerfile
nginx.conf
package.json
src/
docker-compose.yml
.env.exampleAPI Dockerfile
dockerfile
FROM node:22-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY . .
USER node
EXPOSE 3000
CMD ["node", "src/server.js"]Frontend Dockerfile
dockerfile
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80Compose de referencia
yaml
services:
api:
build: ./api
environment:
DATABASE_URL: postgresql://app:app@db:5432/app
REDIS_URL: redis://redis:6379
depends_on:
- db
- redis
frontend:
build: ./frontend
ports:
- "8080:80"
depends_on:
- api
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:Nginx para frontend y API
nginx
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://api:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Validaciones
bash
docker compose build
docker compose up -d
docker compose ps
docker compose logs api
curl http://localhost:8080Requisitos de calidad
- Imagenes multi-stage.
- API sin root.
- Variables en entorno.
- Volumenes para datos.
- Nginx como entrada unica.
- Logs por stdout/stderr.
- Healthchecks si se lleva mas lejos.
- CI que construya y publique imagenes.
Mejoras opcionales
- Migraciones de base de datos.
- Tests en CI.
- Escaneo de imagenes.
- Secrets reales.
- HTTPS.
- Observabilidad.
- Despliegue en Kubernetes.
Cierre
Si entiendes este proyecto, ya tienes las piezas principales: imagenes, contenedores, redes, volumenes, builds multi-stage, proxy inverso, variables, persistencia y diagnostico.
