Saltar a contenido

Docker Compose

Docker Compose es una herramienta poderosa que simplifica la definición y ejecución de aplicaciones Docker de múltiples contenedores, permitiendo a los desarrolladores orquestar y gestionar fácilmente entornos complejos. Utilizando un único archivo de configuración en YAML, conocido como docker-compose.yml, los usuarios pueden especificar todos los servicios que componen su aplicación, incluyendo imágenes, variables de entorno, volúmenes y redes. Esto facilita el desarrollo, las pruebas y el despliegue, ya que Docker Compose permite iniciar todos los contenedores con un solo comando (docker compose up), garantizando que todos los servicios necesarios se configuren y ejecuten de manera coherente. Además, la capacidad de escalar servicios, compartir configuraciones entre entornos e integrarse con herramientas de CI/CD convierte a Docker Compose en una opción popular en los flujos de trabajo modernos de desarrollo de software.

mmd

Conceptos Fundamentales

1. Definición

  • Docker Compose es una herramienta que permite definir y ejecutar aplicaciones Docker compuestas por múltiples contenedores. Utiliza un archivo de configuración (generalmente llamado docker-compose.yml) donde se describen los servicios que componen su aplicación.

2. Archivo docker-compose.yml

  • El archivo docker-compose.yml es donde se definen todos los servicios, redes y volúmenes necesarios para su aplicación. La sintaxis se basa en YAML, lo que hace que la configuración sea bastante legible.

Estructura Básica del docker-compose.yml

services:     # Definición de los servicios
  web:        # Nombre del servicio
    image: nginx:latest  # Imagen a utilizar
    ports:
      - "80:80"  # Mapeo de puertos
  db:         # Otro servicio (base de datos)
    image: postgres:latest
    environment:  # Variables de entorno
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password

Componentes Principales

1. Servicios

  • Cada servicio en docker-compose.yml representa un contenedor. Puede especificar la imagen a utilizar, configuraciones de red, variables de entorno, volúmenes y mucho más.

2. Redes

  • Compose crea una red por defecto para que los servicios se comuniquen entre sí. Puede personalizar las redes, permitiendo que servicios en diferentes redes se comuniquen o aislando servicios según sea necesario.

3. Volúmenes

  • Los volúmenes permiten persistir los datos generados por los contenedores. Se almacenan fuera del ciclo de vida del contenedor, garantizando que los datos no se pierdan cuando un contenedor es eliminado o actualizado.

Comandos Principales de Docker Compose

1. docker compose up

  • Este comando crea e inicia todos los servicios definidos en el archivo docker-compose.yml.
  • Ejemplo:
    docker compose up
    

2. docker compose down

  • Detiene todos los servicios y elimina los contenedores, redes y volúmenes asociados.
  • Ejemplo:
    docker compose down
    

3. docker compose build

  • Este comando construye o reconstruye los servicios definidos en el archivo Compose.
  • Ejemplo:
    docker compose build
    

4. docker compose logs

  • Muestra los logs de todos los servicios en ejecución, permitiéndole monitorear la salida de los contenedores.
  • Ejemplo:
    docker compose logs
    

5. docker compose exec

  • Permite ejecutar comandos en un contenedor en ejecución.
  • Ejemplo:
    docker compose exec web bash
    

Ventajas de Docker Compose

1. Simplicidad

  • Docker Compose simplifica la gestión de aplicaciones de múltiples contenedores, permitiéndole definir todos los servicios en un único archivo de configuración.

2. Consistencia

  • La configuración de la aplicación se puede compartir fácilmente entre diferentes entornos (desarrollo, pruebas, producción), garantizando que todos utilicen la misma configuración.

3. Facilidad de Uso

  • Docker Compose proporciona una interfaz de línea de comandos intuitiva que facilita iniciar, detener y gestionar aplicaciones complejas.

4. Orquestación

  • Aunque Docker Compose no es una herramienta de orquestación completa como Kubernetes, proporciona funcionalidades básicas de orquestación para aplicaciones que no requieren la complejidad de una solución más robusta.

Ejemplo de Docker Compose para el Proyecto

A continuación, se muestra un ejemplo de cómo se utiliza Docker Compose en nuestro proyecto para orquestar los microservicios:

services:
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: root
      POSTGRES_DB: feedback
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  usermanagement:
    build:
      context: ./java_backend
      args:
        APP_NAME: usermanagement
    environment:
      - DB_HOST=db
      - DB_PORT=5432
      - DB_USER=postgres
      - DB_PASS=root
      - JWT_SECRET_KEY=4Z^XrroxR@dWxqf$!@#qGr4P
      - JWT_ISSUER=user-api
    depends_on:
      - db

  feedbackrequest:
    build:
      context: ./java_backend
      args:
        APP_NAME: feedbackrequest
    environment:
      - DB_HOST=db
      - DB_PORT=5432
      - DB_USER=postgres
      - DB_PASS=root
      - JWT_SECRET_KEY=4Z^XrroxR@dWxqf$!@#qGr4P
      - JWT_ISSUER=user-api
    depends_on:
      - db

  feedbackresponse:
    build:
      context: ./java_backend
      args:
        APP_NAME: feedbackresponse
    environment:
      - DB_HOST=db
      - DB_PORT=5432
      - DB_USER=postgres
      - DB_PASS=root
      - JWT_SECRET_KEY=4Z^XrroxR@dWxqf$!@#qGr4P
      - JWT_ISSUER=user-api
    depends_on:
      - db

  feedbackresponseview:
    build:
      context: ./python_backend
      args:
        APP_NAME: feedbackresponseview
    environment:
      - DATABASE_URL=postgresql://postgres:root@db:5432/feedback
    depends_on:
      - db

  nginx:
    image: nginx:alpine
    volumes:
      - ./gateway/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - usermanagement
      - feedbackrequest
      - feedbackresponse
      - feedbackresponseview

volumes:
  postgres_data:

Este archivo Docker Compose define:

  1. Un servicio de base de datos PostgreSQL
  2. Cuatro microservicios (usermanagement, feedbackrequest, feedbackresponse, feedbackresponseview)
  3. Un servicio Nginx como API Gateway
  4. Un volumen para persistir los datos de PostgreSQL

Cada servicio tiene sus propias configuraciones, como variables de entorno, dependencias y mapeos de puertos. Docker Compose gestiona la creación, el inicio y la interconexión de estos servicios, permitiendo que la aplicación completa se ejecute con un solo comando.

Conclusión

Docker Compose es una herramienta esencial para el desarrollo y despliegue de aplicaciones basadas en microservicios. Simplifica significativamente el proceso de configuración y gestión de múltiples contenedores, permitiendo que los desarrolladores se concentren más en la lógica de negocio y menos en la infraestructura.

En el contexto de nuestro proyecto, Docker Compose permite que todos los microservicios, la base de datos y el API Gateway se configuren y ejecuten de forma consistente en cualquier entorno, facilitando el desarrollo, las pruebas y el despliegue de la aplicación.