Guía detallada de configuración YAML para entender Docker Compose

Docker Compose simplifica las aplicaciones de Docker con múltiples contenedores mediante una configuración en YAML. Esta guía explora en profundidad su sintaxis, estructura y las mejores prácticas para definir servicios, redes y volúmenes de manera efectiva.
Índice
Entendiendo Docker Compose: una guía detallada de configuración YAML - Parte 2

Docker Compose es una herramienta poderosa para definir y ejecutar aplicaciones multi-contenedor. En este artículo, exploraremos las características avanzadas de la configuración YAML de Docker Compose, que te permitirán crear entornos de desarrollo y producción más robustos y flexibles.1. Versiones de ComposeEs importante especificar la versión de Compose que estás utilizando al principio de tu archivo docker-compose.yml:```yaml version: '3.8' ```Las versiones más recientes ofrecen más características y mejor soporte para Docker Engine.2. ServiciosLa sección services es donde defines tus contenedores. Aquí hay algunos ejemplos avanzados:```yaml services: web: image: nginx:latest ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf environment: - NGINX_HOST=localhost deploy: replicas: 3 resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M ```En este ejemplo, estamos configurando un servicio web con Nginx, exponiendo el puerto 80, montando un archivo de configuración, estableciendo una variable de entorno y definiendo recursos de despliegue.3. RedesDocker Compose te permite crear y gestionar redes personalizadas:```yaml networks: frontend: driver: bridge backend: driver: bridge ```Luego, puedes asignar servicios a estas redes:```yaml services: web: networks: - frontend api: networks: - frontend - backend ```4. VolúmenesLos volúmenes persistentes son cruciales para almacenar datos:```yaml volumes: db_data: driver: local ```Y puedes usarlos en tus servicios:```yaml services: db: image: postgres:latest volumes: - db_data:/var/lib/postgresql/data ```5. Variables de EntornoPuedes definir variables de entorno en el archivo compose o usar un archivo .env:```yaml services: app: environment: - NODE_ENV=production - DATABASE_URL=${DATABASE_URL} ```6. HealthchecksLos healthchecks te permiten verificar si un contenedor está funcionando correctamente:```yaml services: db: healthcheck: test: ["CMD", "pg_isready", "-U", "postgres"] interval: 30s timeout: 10s retries: 5 ```7. Dependencias entre ServiciosPuedes definir dependencias para controlar el orden de inicio de los contenedores:```yaml services: web: depends_on: db: condition: service_healthy ```8. Configuración ExtendidaDocker Compose permite la herencia de configuración:```yaml services: base: image: node:14 working_dir: /app web: extends: file: base.yml service: base ports: - "3000:3000" ```9. Secretos y ConfigsPara gestionar información sensible, puedes usar secretos:```yaml services: app: secrets: - my_secret secrets: my_secret: file: ./my_secret.txt ```10. Modo Desarrollo vs ProducciónPuedes crear archivos compose separados para diferentes entornos:```bash docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d ```Esto te permite sobrescribir configuraciones específicas para producción.ConclusiónDocker Compose ofrece una amplia gama de características avanzadas que te permiten crear configuraciones complejas y flexibles para tus aplicaciones. Al dominar estas características, podrás optimizar tus flujos de trabajo de desarrollo y despliegue, asegurando que tus aplicaciones sean escalables, seguras y fáciles de gestionar.Recuerda siempre consultar la documentación oficial de Docker Compose para obtener la información más actualizada y detallada sobre todas las opciones disponibles.

Docker ha revolucionado la forma en que los desarrolladores construyen, envían y ejecutan aplicaciones al permitirles empaquetar sus aplicaciones y dependencias en contenedores. Si bien Docker en sí proporciona una poderosa interfaz de línea de comandos, Docker Compose simplifica la gestión de aplicaciones Docker de múltiples contenedores a través de un archivo de configuración YAML. En este artículo, exploraremos las complejidades de Docker Compose, centrándonos en la configuración YAML y sus diversas características. Esta guía avanzada tiene como objetivo profundizar tu comprensión de Docker Compose para agilizar tus flujos de trabajo de desarrollo.

¿Qué es Docker Compose?

Docker Compose is a tool for defining and managing multi-container Docker applications. By using a configuration file (docker-compose.yml), los desarrolladores pueden especificar los servicios, redes y volúmenes necesarios para su aplicación. Docker Compose automatiza el proceso de configuración, inicio y detención de contenedores, convirtiéndolo en una herramienta esencial para arquitecturas de microservicios donde múltiples servicios necesitan interactuar de manera fluida.

Características principales de Docker Compose

  1. Declarative Configuration: Define your application’s services, networks, and volumes in a declarative manner.
  2. Entornos múltiplesGestione fácilmente diferentes configuraciones para entornos de desarrollo, pruebas y producción.
  3. NetworkingCrea automáticamente una red predeterminada para todos los contenedores definidos en el docker-compose.yml, lo que les permite comunicarse entre sí.
  4. Gestión de Volúmenes: Simplifies the management of persistent data with Docker volumes.

Comprensión de la Sintaxis YAML

At the heart of Docker Compose is the YAML (YAML Ain’t Markup Language) syntax. YAML is a human-readable data serialization standard that is easy to read and write. Understanding the basic structure of a YAML file is crucial for effectively using Docker Compose.

Estructura Básica de YAMLYAML es un formato de serialización de datos legible por humanos, ampliamente utilizado para archivos de configuración. Su estructura básica se basa en dos conceptos fundamentales: claves y valores.Claves y valores En YAML, los datos se organizan en pares clave-valor. Una clave es seguida por dos puntos (:) y un espacio, luego viene el valor. Por ejemplo:nombre: Juan Pérez edad: 30 ciudad: MadridListas Las listas en YAML se crean utilizando guiones (-). Cada elemento de la lista comienza con un guión seguido de un espacio:hobbies: - lectura - cine - deportesListas anidadas Las listas pueden contener otras listas:comidas: - desayuno: - café - tostadas - almuerzo: - ensalada - polloDiccionarios anidados Los diccionarios pueden contener otros diccionarios:persona: nombre: Ana García direccion: calle: Calle Mayor 123 ciudad: Barcelona codigo_postal: 08001Tipos de datos YAML soporta varios tipos de datos:- Cadenas de texto (strings) - Números (enteros y flotantes) - Booleanos (true/false) - Nulos (null) - FechasEjemplo completo:empleado: id: 12345 nombre: Carlos López edad: 35 activo: true salario: 45000.50 fecha_contratacion: 2020-05-15 habilidades: - programación - liderazgo - comunicaciónYAML también permite comentarios, que comienzan con el símbolo #:# Este es un comentario nombre: María Rodríguez # Comentario al final de la líneaEsta estructura básica proporciona una base sólida para crear archivos YAML complejos y bien organizados para diversas aplicaciones.

YAML utiliza sangría para representar estructuras anidadas, lo que puede dar lugar a configuraciones más limpias y legibles. Estos son algunos elementos clave:

  • Key-Value Pairs: Represented as clave: valor.
  • ListasDenotado por un guión - seguido de un espacio.
  • Dictionaries: Nest key-value pairs within a dictionary.

Ejemplo de Estructura Básica YAML

servicios:
  web:
    imagen: nginx:latest
    puertos:
      - "80:80"

In this example, servicios is a dictionary containing one service called web, which uses the latest Nginx image and maps port 80 of the host to port 80 of the container.

Docker Compose File Structure

Típico docker-compose.yml file has several top-level keys that define various aspects of your application. Here are the most common keys you will encounter:

1. versión

El versión key specifies the Compose file format version. Each version may have different features and options. As of October 2023, the latest version is 3.9, but older formats like 2.x todavía están en uso.

version: "3.9"

2. servicios

El servicios La clave es donde defines los contenedores individuales que componen tu aplicación. Cada servicio puede tener diversas configuraciones, incluyendo la imagen, el contexto de compilación, variables de entorno, puertos y más.

Ejemplo de configuración del servicio

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    environment:
      - DEBUG=1

3. networks

Docker Compose crea automáticamente una red para tus servicios, pero puedes definir redes personalizadas en la sección networks key. This allows you to control how your containers communicate with each other.

Network Configuration Example

redes:
  frontend:
  backend:

Luego puede especificar qué servicios están conectados a qué redes:

servicios:
  web:
    networks:
      - frontend
  base de datos:
    networks:
      - backend

4. volumes

Volumes are used for persistent storage, allowing you to store data outside of your containers. You can define volumes under the volumes claves y luego configurarlas en sus servicios.

Volume Configuration Example

volúmenes:
  datos-bd:

To mount a volume in a service:

services:
  database:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data

5. depends_on

El depends_on la clave especifica las dependencias entre servicios. Asegura que un servicio se inicie solo después de que sus dependencias estén activas y en funcionamiento. Sin embargo, ten en cuenta que depends_on no espera a que el servicio esté "listo"—solo a que se inicie.

depends_on Ejemplo

services:
  web:
    build: .
    depends_on:
      - database
  database:
    image: postgres

Opciones de configuración avanzadas

Además de la estructura básica y las claves, Docker Compose ofrece varias opciones de configuración avanzadas que pueden mejorar enormemente sus despliegues.

1. Contexto de construcción y Dockerfile

When building images, you can specify the build context and Dockerfile explicitly. This is especially useful in larger applications with complex build processes.

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.dev

2. Variables de Entorno

Puedes establecer variables de entorno directamente en el docker-compose.yml file or reference an external .env file. Environment variables are critical for configuring services dynamically.

Ejemplo de Variables de Entorno

services:
  app:
    environment:
      - NODE_ENV=production
    env_file:
      - .env

3. Controles de Salud

Docker Compose permite definir comprobaciones de estado para tus servicios. Esto asegura que tu aplicación solo se inicie una vez que todas las dependencias estén en buen estado.

servicios:
  web:
    imagen: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      intervalo: 30s
      timeout: 10s
      reintentos: 3

4. Labeling

Las etiquetas proporcionan una forma de organizar y gestionar sus servicios. Puede agregar etiquetas a sus servicios para mayor claridad y facilidad de gestión.

services:
  web:
    image: nginx
    labels:
      - "com.example.env=production"

5. Command and Entry Point

You can override the default command and entry point defined in the Docker image by specifying orden and punto de entrada.

services:
  web:
    image: nginx
    entrypoint: ["/bin/sh", "-c"]
    command: ["nginx -g 'daemon off;'"]

6. Logging Configuration

Docker Compose allows you to define logging configuration for each service. This is useful for managing how logs are handled and where they are stored.

services:
  app:
    image: my-app
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Uso de los comandos de la CLI de Docker ComposeEn esta sección, aprenderá a usar los comandos de la CLI de Docker Compose para administrar el ciclo de vida de su aplicación. Los comandos de la CLI de Docker Compose le permiten crear, iniciar, detener y eliminar los servicios definidos en su archivo docker-compose.yml. También puede ver el estado de los servicios, transmitir los registros de los servicios y ejecutar un comando de un solo uso en un servicio.Para ver una lista de todos los comandos disponibles, ejecute:``` docker-compose --help ```Para ver la ayuda de un comando específico, ejecute:``` docker-compose COMMAND --help ```Por ejemplo, para ver la ayuda del comando `up`, ejecute:``` docker-compose up --help ```Los siguientes comandos de la CLI de Docker Compose son los más utilizados:- `docker-compose up`: Crea e inicia los contenedores. - `docker-compose down`: Detiene y elimina los contenedores, redes, imágenes e volúmenes. - `docker-compose ps`: Enumera los contenedores. - `docker-compose logs`: Transmite los registros de los contenedores. - `docker-compose exec`: Ejecuta un comando en un contenedor en ejecución. - `docker-compose run`: Ejecuta un comando en un nuevo contenedor. - `docker-compose pause`: Pausa los servicios. - `docker-compose unpause`: Reanuda los servicios. - `docker-compose start`: Inicia los servicios. - `docker-compose stop`: Detiene los servicios. - `docker-compose restart`: Reinicia los servicios. - `docker-compose rm`: Elimina los contenedores detenidos. - `docker-compose build`: Construye o reconstruye los servicios. - `docker-compose pull`: Extrae las imágenes de los servicios. - `docker-compose config`: Valida y muestra la configuración. - `docker-compose images`: Enumera las imágenes. - `docker-compose top`: Muestra los procesos principales. - `docker-compose events`: Transmite los eventos del contenedor. - `docker-compose kill`: Mata los contenedores. - `docker-compose scale`: Establece el número de contenedores para un servicio. - `docker-compose port`: Imprime el puerto público para un enlace de puerto. - `docker-compose cp`: Copia archivos o carpetas entre un contenedor y el sistema de archivos local. - `docker-compose diff`: Inspecciona los cambios en los archivos o directorios en un contenedor de servicio.Para obtener más información sobre un comando específico, consulte la documentación de referencia de la CLI de Docker Compose.

Una vez que hayas definido tu docker-compose.yml archivo, puedes usar varios comandos de la CLI para gestionar tu aplicación:

1. docker-compose up

Este comando construye, (re)crea, inicia y se conecta a contenedores para un servicio.

docker-compose up

2. docker-compose down

Shuts down your application, removing all the containers defined in your docker-compose.yml.

docker-compose down

3. docker-compose logs

Muestra los registros de tus servicios en ejecución, ofreciendo información sobre su funcionamiento.

docker-compose logs

4. docker-compose exec

Ejecuta un comando en un contenedor en ejecución.

docker-compose exec app bash

5. docker-compose ps

Enumera los contenedores que forman parte de tu aplicación.

docker-compose ps

Buenas Prácticas para Docker Compose

To get the most out of Docker Compose, consider the following best practices:

  1. Control de VersionesVersiona siempre tus archivos. docker-compose.yml file to track changes and facilitate collaboration.
  2. Utiliza archivos .envLos archivos .env son una forma conveniente de almacenar variables de entorno para tu aplicación. Estos archivos contienen pares clave-valor que se cargan en el entorno de tu aplicación cuando se inicia. Esto te permite mantener la configuración de tu aplicación separada del código fuente, lo que facilita la gestión de diferentes entornos (desarrollo, producción, etc.) y mantiene la información sensible fuera del control de versiones.Para utilizar archivos .env en tu proyecto, sigue estos pasos:1. Instala el paquete `python-dotenv` utilizando pip: ``` pip install python-dotenv ```2. Crea un archivo `.env` en la raíz de tu proyecto con las siguientes variables de entorno: ``` DATABASE_URL=postgresql://user:password@localhost/dbname SECRET_KEY=your-secret-key ```3. En tu código, importa y carga el archivo `.env` al inicio de tu aplicación: ```python from dotenv import load_dotenv import osload_dotenv()database_url = os.getenv('DATABASE_URL') secret_key = os.getenv('SECRET_KEY') ```4. Asegúrate de agregar el archivo `.env` a tu archivo `.gitignore` para evitar que se suba a tu repositorio de código.Recuerda que los archivos `.env` no deben ser comprometidos en el control de versiones, ya que pueden contener información sensible como contraseñas o claves de API.: Store sensitive information, such as API keys or database passwords, in a .env file and reference them in your docker-compose.yml.
  3. Keep It SimpleEvita configuraciones excesivamente complejas. Divide los servicios en unidades más pequeñas y manejables.
  4. Document Your ConfigurationIncluye comentarios en tu código para mejorar su legibilidad y mantenibilidad. Los comentarios son líneas de texto que no se ejecutan como parte del programa, sino que sirven para explicar qué hace el código o por qué se escribió de cierta manera. Esto es especialmente útil cuando trabajas en proyectos grandes o cuando otras personas necesitan entender tu código.Aquí tienes algunos consejos para escribir buenos comentarios:1. **Explica el propósito**: Comenta por qué estás haciendo algo, no solo qué estás haciendo. Por ejemplo, en lugar de escribir "suma los números", podrías escribir "calcula el total de la compra".2. **Sé conciso**: Los comentarios deben ser breves y directos. Evita escribir párrafos largos que puedan distraer del código.3. **Usa un lenguaje claro**: Asegúrate de que tus comentarios sean fáciles de entender para cualquier persona que lea tu código, incluso si no está familiarizada con el proyecto.4. **Comenta las partes complejas**: Si hay una sección de código que es particularmente complicada o que podría ser confusa, añade un comentario para explicarla.5. **Mantén los comentarios actualizados**: Si modificas el código, asegúrate de actualizar también los comentarios para que sigan siendo precisos.6. **Usa el formato adecuado**: Dependiendo del lenguaje de programación que estés utilizando, hay diferentes formas de escribir comentarios. Por ejemplo, en Python, puedes usar el símbolo # para comentarios de una sola línea, o triple comillas (""") para comentarios de varias líneas.7. **No abuses de los comentarios**: Aunque los comentarios son útiles, no los uses en exceso. El código bien escrito y con nombres de variables descriptivos a menudo puede ser autoexplicativo.8. **Comenta las decisiones de diseño**: Si has tomado una decisión de diseño específica que podría no ser obvia, añade un comentario para explicarla.9. **Usa comentarios para documentar funciones y clases**: Muchos lenguajes de programación tienen herramientas de documentación automática que pueden generar documentación a partir de comentarios especiales. Asegúrate de seguir las convenciones de tu lenguaje para estos comentarios.10. **Revisa tus comentarios**: Antes de considerar tu código completo, revisa tus comentarios para asegurarte de que son claros, precisos y útiles.Recuerda que los comentarios son una herramienta poderosa para mejorar la calidad de tu código, pero deben usarse con moderación y de manera efectiva. docker-compose.yml para explicar configuraciones para referencia futura.
  5. Utiliza volúmenes con nombrePara una gestión de datos más sencilla, prefiere volúmenes con nombre en lugar de anónimos.

Conclusión

Docker Compose es una herramienta invaluable para gestionar aplicaciones Docker multi-contenedor. Al aprovechar el formato de configuración YAML, los desarrolladores pueden definir y gestionar fácilmente los servicios, redes y volúmenes requeridos por sus aplicaciones. Ya sea que estés trabajando en una compleja arquitectura de microservicios o en una simple configuración multi-contenedor, comprender los entresijos de Docker Compose potenciará considerablemente tu flujo de trabajo de desarrollo.

Al seguir las pautas y las mejores prácticas descritas en este artículo, puede crear código limpio, eficiente y fácil de mantener. docker-compose.yml archivos que sirven como la base fundamental de tus aplicaciones en contenedores. Ya seas nuevo en Docker o busques mejorar tu conocimiento existente, dominar Docker Compose es un paso crítico para construir aplicaciones robustas y escalables.