version: '3.8'
services:
backend:
...
frontend:
...
image-server:
...
db:
...
volumes:
...
networks:
...Define la versión del esquema de Docker Compose.
La 3.8 es una versión compatible con muchas funciones modernas, incluyendo redes y volúmenes.
backend:
build: ./backend
ports:
- "3000:3000"
volumes:
- uploaded-images:/app/uploads
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/mydatabase
depends_on:
- db
networks:
- app-networkbuild: ./backend: construye la imagen usando elDockerfiledentro de la carpetabackend.ports: mapea el puerto 3000 del contenedor al host (localhost:3000).volumes: comparte un volumen llamadouploaded-imagespara almacenar las imágenes que subas.environment: define una variable de entorno con la URL de conexión a PostgreSQL.depends_on: espera a que el contenedordb(la base de datos) esté disponible antes de iniciar.networks: lo conecta a una red virtual para comunicarse con otros servicios.
image-server:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- uploaded-images:/usr/share/nginx/html
networks:
- app-network- Usa una imagen oficial de Nginx.
- Sirve contenido en el puerto 8080 del host.
- Monta el volumen
uploaded-images, apuntando al directorio donde Nginx sirve archivos estáticos. - Gracias a este volumen compartido, las imágenes subidas por el backend pueden ser vistas desde el navegador.
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
networks:
- app-network- Construye tu aplicación Angular desde la carpeta
frontend. - Expone el puerto 80 al navegador.
- Espera a que el backend esté listo antes de iniciar.
- Se comunica con el backend e image-server a través de la misma red.
db:
image: postgres:15
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-network- Usa una imagen oficial de PostgreSQL 15.
- Configura el usuario, contraseña y nombre de la base de datos.
- Usa un volumen (
pgdata) para guardar los datos de forma persistente. - Está en la misma red para que el backend pueda accederlo como
db.
volumes:
uploaded-images:
pgdata:uploaded-images: volumen compartido entre el backend y el servidor Nginx.pgdata: volumen persistente para la base de datos PostgreSQL.
networks:
app-network:
driver: bridgeCrea una red interna para que todos los contenedores se comuniquen por nombre (por ejemplo: http://backend:3000, http://db:5432).
-
Construye las imágenes (backend y frontend).
-
Inicia los contenedores: base de datos, backend, frontend y Nginx.
-
Los contenedores se comunican entre sí usando la red
app-network. -
Los archivos subidos desde el backend se almacenan en
uploaded-imagesy son servidos por Nginx. -
Angular puede acceder al backend o imágenes usando rutas como:
http://backend:3000http://image-server:80
