Saltar a contenido

Docker Compose

1. Intoducción.

Docker Compose es una herramienta diseñada para definir y ejecutar aplicaciones de múltiples contenedores que pertenecen a un mismo entorno. Su propósito principal es gestionar conjuntos de contenedores que tienen dependencias entre sí y necesitan cominicarse.

  • Prerrequisitos: Es fundamental comprender conceptos básicos de Docker (contenedores, imágenes, Dockerfile) antes de utilizar Compose.
  • Problema que resuelve: Ejecutar múltiples contenedores mediante comandos individuales de 'docker run' es un proceso manual, tedioso y propenso a erores, especialmente cuando se gestionan decenas de servicios.

2. Estructura del archivo 'docker-compose.yml'

Docker compose utiliza un archivo en formato para centralizar toda la configuración de los servicios como código. Los componentes clave del archivo son:

  • version:

    Define la versión de la especificación del Docker Compose compatible con la herramienta instalada.

  • services:

    Es el atributo principal donde se listan todos los contenedores que se iniciarán.

  • Atributos por servicio:

    • image: Especifica la imagen del Docker Hub o un registro privado que se utilizará-
    • ports: Mapea los puertos del host a los puertos internos del contenedor (ej. 'host:container')
    • environment: Permite definir variables de enrotno, como credenciales de bases de datos.
    • build: Se usa en lugar de 'image' para construir una imagen personalizada desde un Dockerfile local.
    • depends_on: Gestión de dependencias. Permite establecer un orden de inicio entre servicios.

Ejemplo:

docker-compose.yml
version: '3.1'
    services:
        app:
            container_name: letschat
            image: sdelements/lets-chat
            restart: always
            environment:
                LCB_DATABASE_URI: mongodb://mongo/letschat
            ports:
                - 80:8080
            depends_on:
                - db
        db:
            container_name: mongo
            image: mongo
            restart: always
            volumes:
                - /opt/mongo:/data/db

3. Comandos principales.

Docker Compose facilita la gestión del ciclo de vida de la aplicación con comandos simplificados:

  • docker-compose up

    Lee el archivo , crea la red necesaria e inicia todos los servicios. Se puede usar la bandera -d para ejecutaren modo desatendido (background)

  • docker-compose down

    Detiene y elimina los contenedores y las redes creadas.

  • docker-compose stopy docker-compose start

    Detienen e inician los contenedores existentes SIN eliminarlos, preservando el estado interno del contenedor si no hay volúmenes configurados.

Cuidado al usar 'docker-compose down' porque se eliminarán los datos del contenedor sino se utilizan volúmenes

4. Redes y Nombres.

  • Redes automáticas: Docker Compose crea automáticamente una red compartida aislada para todos los servicios definidos en el archivo, permitiendo que se comuniquen entre sí usando solo el nombre del servicio.
  • Nombres de proyectos: Por defecto, Compose utiliza el nombre de la carpeta donde se ejecuta el archivo como prefijo para los nombres de los contenedores y las redes. Este comportamiento se puede sobreescribir con la bandera.

5. Seguridad y Variables de Entorno.

Es una mala práctica de seguridad incluir credenciales sensibles (contraseñas, API keys...) directamente en el código del archivo .

  • Sintaxis de variables: ${NOMBRE_VARIABLE}

  • Asignación: Los valores reales se pueden definir como variables de entorno en el sistema operativo o mediante un arvhivo .env, lo que permite compartir el archivo de Compose sin exponer secretos.

6. Integración con Registros Privados.

Para entornos de producción o pruebas finales, Docker Compose puede extraer imágenes de registros privados (como Docker hub o ECR).

  • Autenticación: Compose utiliza el estado de autenticación generado por el comando 'docker login'para acceder y descargar las imágenes configuradas.

7. Evolución de Docker-compose a Kubernetes.

Docker Compose es ideal para gestionar conjuntos pequeños o medianos de contenedores en entornos de desarrollo o pruebas. Sin embargo, tiene límites de escala:

  • Kubernetes: Se utiliza cuando la aplicación requiere escalar a miles de contenedores distribuidos en múltiples servidores y necesita funciones de "Autohealing" (reinicio automático si un contenedor falla)