Tabla de Contenidos

08 - Arquitectura de aplicación

Hasta aquí, cada servidor se ha arrancado por su lado: un Tomcat, un MinIO, una base de datos. Una aplicación real es un sistema de varios servidores que colaboran. Docker Compose (tema 02) permite describir ese sistema completo en un compose.yaml y arrancarlo de una vez.

1. El sistema

La arquitectura de referencia de una aplicación web clásica:

Navegadornginxpuerto 80AppTomcat :8080MariaDB:3306MinIO:9000HTTP (único puerto publicado)frontend estático/api/** (reverse proxy)JDBC (red interna)API S3 (red interna)

2. La descripción: compose.yaml

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./frontend:/usr/share/nginx/html:ro
    depends_on:
      - app

  app:
    build: ./app
    environment:
      DB_URL: jdbc:mariadb://db:3306/miapp
      S3_ENDPOINT: http://minio:9000
    depends_on:
      - db
      - minio

  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: secreto
      MARIADB_DATABASE: miapp
    volumes:
      - db-data:/var/lib/mysql

  minio:
    image: elestio/minio
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: secreto123
    volumes:
      - minio-data:/data

volumes:
  db-data:
  minio-data:

$ docker compose up -d      # los cuatro servicios, juntos
$ docker compose down

3. Red interna y nombres

Compose crea una red propia donde cada servicio es alcanzable por su nombre: Docker resuelve db y minio a la IP de esos contenedores (DNS interno).

depends_on ordena el arranque de los servicios.

4. La configuración de nginx

server {
    listen 80;

    location /api/ {
        proxy_pass http://app:8080;
    }

    location / {
        root /usr/share/nginx/html;
    }
}

Para el navegador todo sale del mismo servidor: el frontend en / y la API en /api/. El proxy usa el nombre app de la red interna; si la app cambia de nombre o de puerto, solo toca este fichero.

5. Lo que aporta

Aporte Cómo lo da Compose
Reproducibilidad Un compose.yaml describe el sistema completo: el mismo resultado en cualquier máquina
Paralelismo con producción La topología (proxy + app + BBDD + storage) es la de un despliegue real
Aislamiento Cada pieza en su contenedor, con su versión exacta
Exposición mínima Solo nginx publica un puerto; el resto vive en la red interna
La arquitectura del ejemplo es la clásica de tres niveles: presentación (nginx), aplicación (Tomcat) y datos (MariaDB, MinIO). Sustituir una pieza —otra base de datos, S3 real en producción— toca la configuración del servicio, no la estructura del sistema. Y si la aplicación necesita más capacidad, se escala horizontalmente añadiendo réplicas detrás del proxy.