DevOps

Guía de Docker Compose para Ubuntu

Tabla de contenido

Guía completa sobre Docker Compose para sistemas Ubuntu Linux – Revista Completa

Introducción a Docker Compose y su importancia en la gestión de aplicaciones multi-contenedor

En la actualidad, la contenedorización ha revolucionado la forma en que los desarrolladores, administradores de sistemas y arquitectos diseñan, implementan y mantienen aplicaciones en diversos entornos. Docker, como plataforma de contenedores, ha sido pionero en ofrecer una solución eficiente, portable y escalable para encapsular aplicaciones y sus dependencias en unidades independientes y ligeras. Sin embargo, la gestión de múltiples contenedores de manera coordinada puede resultar compleja si se realiza de forma manual o mediante scripts dispersos. Es en este contexto donde surge Docker Compose, una herramienta creada para simplificar la orquestación y administración de aplicaciones que constan de múltiples contenedores.

En esta extensa revisión, publicada en Revista Completa, abordaremos en profundidad todos los aspectos relacionados con Docker Compose, desde su proceso de instalación en sistemas Ubuntu Linux, hasta sus capacidades avanzadas para gestionar aplicaciones complejas en entornos de desarrollo, pruebas y producción. La intención es proporcionar un conocimiento exhaustivo, fundamentado en conceptos técnicos y en las mejores prácticas del sector, para que los lectores puedan aprovechar al máximo las funcionalidades de esta poderosa herramienta.

Contexto y evolución de Docker y Docker Compose

El nacimiento y la expansión de Docker

Docker fue desarrollado por Solomon Hykes en 2013 y rápidamente adquirió popularidad debido a su capacidad para ofrecer entornos de desarrollo reproducibles, portables y eficientes. La principal ventaja de Docker radica en su uso de contenedores, que permiten encapsular aplicaciones y sus dependencias en unidades independientes, eliminando problemas tradicionales relacionados con la compatibilidad y la configuración del sistema operativo. La facilidad para crear, distribuir y escalar contenedores ha impulsado a Docker como una de las tecnologías más relevantes en la actualidad.

La necesidad de gestionar múltiples contenedores

A medida que las aplicaciones crecían en complejidad, con múltiples microservicios y componentes interdependientes, surgió la necesidad de herramientas que permitieran definir, gestionar y orquestar estos conjuntos de contenedores de forma coherente y eficiente. La gestión manual de varios contenedores mediante comandos aislados resultaba poco práctica y propensa a errores, especialmente en ambientes donde se requería automatización y despliegue continuo.

¿Qué es Docker Compose y por qué se vuelve imprescindible?

Docker Compose surge como respuesta a estas necesidades, ofreciendo la posibilidad de definir toda la infraestructura de una aplicación en un solo archivo YAML. Con Docker Compose, los desarrolladores y administradores pueden describir los servicios, redes, volúmenes y dependencias en un formato declarativo, simplificando enormemente el proceso de despliegue, escalado y mantenimiento de aplicaciones multi-contenedor. Esto se traduce en una mayor eficiencia, reproducibilidad y facilidad para gestionar entornos complejos.

Requisitos y proceso de instalación de Docker Compose en Ubuntu Linux

Consideraciones previas y compatibilidad

Antes de proceder con la instalación de Docker Compose en Ubuntu, es fundamental contar con un sistema actualizado y con Docker instalado y configurado correctamente. La versión de Docker instalada debe ser compatible con la versión de Docker Compose que se desea utilizar. La mayoría de las versiones modernas de Ubuntu (como Ubuntu 20.04 LTS y 22.04 LTS) soportan sin problemas la instalación de Docker y Docker Compose, siempre que se sigan las instrucciones adecuadas.

Pasos detallados para la instalación en Ubuntu Linux

1. Actualización del sistema y preparación del entorno

Para comenzar, es recomendable actualizar los repositorios e instalar las dependencias básicas necesarias para la instalación de Docker y Docker Compose. Esto se realiza mediante los comandos:

sudo apt update
sudo apt upgrade -y
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

2. Instalación de Docker Engine

El siguiente paso consiste en instalar Docker Engine. Se añaden las claves oficiales y los repositorios de Docker para asegurarse de obtener versiones recientes y seguras:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu 
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

3. Verificación de la instalación de Docker

Para asegurarse de que Docker se ha instalado correctamente, se puede ejecutar:

sudo systemctl status docker
docker --version

4. Instalación de Docker Compose

Para instalar Docker Compose, se debe descargar la versión estable más reciente desde el repositorio oficial de GitHub. La forma más común y recomendada es mediante curl:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Posteriormente, se aplican permisos de ejecución al binario:

sudo chmod +x /usr/local/bin/docker-compose

5. Verificación de la instalación de Docker Compose

Finalmente, para verificar que Docker Compose se ha instalado correctamente, se ejecuta:

docker-compose --version

El resultado debe mostrar la versión instalada, confirmando que la instalación fue exitosa y que la herramienta está lista para su uso en Ubuntu Linux.

Fundamentos y estructura de un archivo Docker Compose

El archivo YAML: núcleo de la configuración

El archivo típico de Docker Compose se denomina docker-compose.yml y está escrito en formato YAML, que permite una configuración estructurada y legible tanto para humanos como para máquinas. La finalidad principal de este archivo es definir todos los componentes necesarios para desplegar una aplicación multi-contenedor, incluyendo los servicios, redes, volúmenes y variables de entorno.

Componentes principales del archivo YAML

  • version: Especifica la versión del esquema de Docker Compose que se está utilizando.
  • services: Define cada uno de los servicios o contenedores que integran la aplicación. Cada servicio puede tener configuraciones específicas, como imagen, puertos, variables de entorno, dependencias, volúmenes, etc.
  • volumes: Permite definir y gestionar volúmenes persistentes que almacenan datos de los contenedores, facilitando la persistencia y la compartición de datos entre contenedores.
  • networks: Define redes personalizadas para la comunicación entre los servicios, permitiendo aislar o interconectar componentes según sea necesario.

Ejemplo práctico y análisis del archivo docker-compose.yml

A continuación, se presenta un ejemplo completo y detallado que ilustra la configuración de una aplicación sencilla que incluye un servidor web PHP y una base de datos MySQL:

version: '3.8'
services:
  db:
    image: mysql:5.7
    container_name: mi_base_de_datos
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ejemplo123
      MYSQL_DATABASE: miapp
      MYSQL_USER: usuarioapp
      MYSQL_PASSWORD: pass1234
    ports:
      - "3306:3306"
  web:
    image: php:7.4-apache
    container_name: servidor_web
    volumes:
      - ./src:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db
volumes:
  db_data:
    driver: local

Este ejemplo define dos servicios: db (una base de datos MySQL) y web (un servidor web PHP con Apache). La directiva depends_on asegura que el servidor web se inicie después de que la base de datos esté lista, garantizando un orden de arranque correcto. Los volúmenes permiten la persistencia de datos y la integración del código fuente del frontend.

Uso práctico de Docker Compose: comandos esenciales y flujo de trabajo

Comandos básicos y sus funciones

Comando Descripción
docker-compose up Construye, crea y arranca todos los servicios definidos en el archivo YAML. Si los contenedores ya existen, los reinicia y actualiza según las configuraciones.
docker-compose down Detiene y elimina los contenedores, redes y volúmenes creados por up. Es útil para limpiar el entorno y reiniciar desde cero.
docker-compose ps Muestra el estado actual de todos los servicios en ejecución, incluyendo los contenedores en marcha, detenidos o en error.
docker-compose logs Permite visualizar los registros o logs de todos los servicios, facilitando la depuración y monitoreo.
docker-compose restart Reinicia los servicios sin tener que detener y volver a crear los contenedores.
docker-compose build Construye las imágenes personalizadas definidas en el archivo, útil cuando hay cambios en Dockerfile o en configuraciones de construcción.

Ejemplo de flujo de trabajo típico

Supongamos que se ha preparado un archivo docker-compose.yml con la configuración deseada. Para desplegar la aplicación, se ejecuta:

docker-compose up -d

El parámetro -d (detached) permite que los contenedores se ejecuten en segundo plano, liberando la terminal. Para verificar que los servicios están en marcha, se puede usar:

docker-compose ps

Para detener y limpiar los recursos utilizados, se ejecuta:

docker-compose down

Este sencillo flujo de trabajo permite gestionar toda la infraestructura con comandos claros y coherentes, promoviendo prácticas de desarrollo ágil y DevOps.

Gestión avanzada y personalización en Docker Compose

Variables de entorno y sustitución dinámica

Una de las características más potentes de Docker Compose es la capacidad de parametrizar la configuración mediante variables de entorno. Esto permite adaptar la misma configuración a diferentes entornos (desarrollo, pruebas, producción) sin modificar el archivo YAML principal. Las variables se definen en archivos .env o en el entorno del sistema y se sustituyen automáticamente en el archivo de configuración.

Ejemplo de uso de variables

version: '3.8'
services:
  web:
    image: php:7.4-apache
    environment:
      APP_ENV: ${APP_ENV}
    ports:
      - "${PORT_HOST}:80"

Aquí, APP_ENV y PORT_HOST son variables que se pueden definir en un archivo .env o en la línea de comandos, facilitando la personalización sin alterar la configuración principal.

Redes y volúmenes personalizables

Más allá de los valores predeterminados, Docker Compose permite definir redes personalizadas para aislar o conectar servicios específicos. Esto es especialmente útil en aplicaciones con múltiples componentes que requieren comunicación segura o segmentada. La gestión de volúmenes también se puede ajustar, permitiendo compartir datos entre contenedores o mantener persistencia de forma controlada.

Extensibilidad y compatibilidad con herramientas de orquestación

Aunque Docker Compose está principalmente orientado a entornos de desarrollo y pruebas, su compatibilidad con Docker Swarm y Kubernetes permite escalar y gestionar aplicaciones en producción de menor escala o en fases iniciales. Los archivos YAML de Compose pueden adaptarse para su utilización en estos entornos, facilitando la transición y escalabilidad futura.

Casos de uso avanzados y ejemplos prácticos en escenarios reales

Arquitectura de microservicios con múltiples componentes interconectados

Una de las aplicaciones más frecuentes de Docker Compose es la orquestación de microservicios que interactúan en una red privada. Por ejemplo, una plataforma de comercio electrónico puede incluir servicios como frontend, backend, base de datos, sistema de caché y colas de mensajes. La configuración YAML puede definir todos estos componentes, sus dependencias y sus redes internas, permitiendo un despliegue sencillo y coherente.

Ejemplo de configuración avanzada para microservicios

version: '3.8'
services:
  frontend:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app-network
  backend:
    image: node:14
    environment:
      NODE_ENV: production
    volumes:
      - ./backend:/app
    depends_on:
      - database
    networks:
      - app-network
  database:
    image: mongo:4.4
    volumes:
      - mongo_data:/data/db
    networks:
      - app-network
volumes:
  mongo_data:
    driver: local
networks:
  app-network:
    driver: bridge

Este ejemplo muestra cómo definir una red personalizada (app-network) y compartir volúmenes persistentes. La estructura facilita el escalado y el mantenimiento de la infraestructura.

Gestión de dependencias y orden de arranque

La directiva depends_on en Docker Compose garantiza que los servicios dependientes se inicien en el orden correcto, aunque no controla el estado de disponibilidad. Para gestionar dependencias más complejas, se pueden combinar scripts de espera o mecanismos de salud (health checks) que aseguren que los componentes están listos antes de proceder con otros servicios.

Implementación en entornos de producción y automatización

Aunque Docker Compose está diseñado principalmente para desarrollo y pruebas, su uso en producción es viable en aplicaciones de menor escala o en entornos controlados. La integración con sistemas CI/CD, mediante pipelines automatizados, permite desplegar, actualizar y mantener aplicaciones con alta eficiencia. Además, su compatibilidad con Docker Swarm facilita la escalabilidad y la alta disponibilidad en escenarios productivos.

Mejores prácticas y recomendaciones para aprovechar Docker Compose al máximo

Estructuración de archivos y organización del proyecto

Mantener una estructura modular y clara en la organización de archivos ayuda a gestionar proyectos complejos. Es recomendable separar los archivos de configuración, los scripts de despliegue y los recursos estáticos en directorios específicos, facilitando la mantenibilidad y la colaboración en equipo.

Uso de variables y secretos de forma segura

Para gestionar información sensible, como contraseñas y claves API, se recomienda utilizar variables de entorno y mecanismos seguros de almacenamiento, evitando incluir datos sensibles directamente en los archivos YAML. Docker Compose puede integrarse con gestores de secretos o archivos encriptados para mayor seguridad.

Automatización y scripts de despliegue

La integración con herramientas de automatización, como Make, Ansible o scripts shell personalizados, permite ejecutar comandos de Docker Compose de forma repetible y controlada. Esto resulta en despliegues más fiables y en la reducción de errores humanos.

Comparativa entre Docker Compose, Docker Swarm y Kubernetes

Características principales y casos de uso

Herramienta Enfoque principal Escalabilidad Facilidad de uso Ideal para
Docker Compose Orquestación local y en entornos de desarrollo Moderada, para aplicaciones pequeñas y medianas Alta, configuración sencilla
Docker Swarm Orquestación en clústeres Docker nativos Alta, escalabilidad sencilla Moderada
Kubernetes Orquestación avanzada, escalable y robusta Muy alta, suitable para grandes despliegues Compleja, requiere conocimientos especializados

Elegir la herramienta adecuada depende del tamaño de la aplicación, del entorno y de los objetivos de escalabilidad y automatización. Docker Compose es ideal para desarrollo y pruebas, mientras que Kubernetes y Docker Swarm son más adecuados para producción en entornos complejos y de alta demanda.

Fuentes, referencias y recursos adicionales

Conclusión y visión de futuro

Docker Compose ha consolidado su posición como una herramienta fundamental en la gestión de aplicaciones multi-contenedor, ofreciendo una solución declarativa, sencilla y efectiva para definir y desplegar infraestructura basada en contenedores. Su integración con otros ecosistemas de orquestación y su capacidad para adaptarse a diferentes entornos hacen que siga siendo una opción preferida en fases iniciales de desarrollo y en despliegues de escala pequeña a mediana. Con el avance de las tecnologías de contenedores y la creciente demanda de automatización, se espera que Docker Compose evolucione para incorporar nuevas capacidades, mayor integración con plataformas de orquestación más complejas y mejoras en la seguridad y el rendimiento.

Para quienes desean profundizar en la gestión eficiente de aplicaciones en Docker, dominar Docker Compose es un paso imprescindible. La plataforma Revista Completa continúa comprometida con ofrecer contenido técnico actualizado, confiable y de alto valor, que permita a los profesionales mantenerse a la vanguardia en el uso de tecnologías de contenedores y orquestación.

Botón volver arriba