En este tema, aprenderemos cómo gestionar aplicaciones que requieren múltiples contenedores utilizando Docker Compose. Las aplicaciones modernas a menudo están compuestas por varios servicios que necesitan comunicarse entre sí, y Docker Compose facilita la definición y gestión de estos servicios.

Objetivos de Aprendizaje

  • Comprender la necesidad de aplicaciones multi-contenedor.
  • Aprender a definir múltiples servicios en un archivo docker-compose.yml.
  • Ejecutar y gestionar aplicaciones multi-contenedor con Docker Compose.
  • Ejemplos prácticos de aplicaciones multi-contenedor.

¿Por Qué Aplicaciones Multi-Contenedor?

Las aplicaciones modernas suelen estar compuestas por varios servicios independientes que trabajan juntos. Por ejemplo, una aplicación web puede tener:

  • Un servidor web (como Nginx o Apache).
  • Una base de datos (como MySQL o PostgreSQL).
  • Un servicio de caché (como Redis o Memcached).

Docker Compose permite definir y ejecutar estos servicios de manera coordinada, simplificando la gestión y el despliegue de aplicaciones complejas.

Definiendo Servicios en docker-compose.yml

El archivo docker-compose.yml es donde se definen los servicios que componen tu aplicación. A continuación, se muestra un ejemplo básico de un archivo docker-compose.yml para una aplicación web con un servidor web y una base de datos:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: exampledb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Explicación del Archivo

  • version: Especifica la versión del formato de archivo de Docker Compose.
  • services: Define los servicios que componen la aplicación.
    • web: Define el servicio del servidor web.
      • image: Especifica la imagen de Docker a utilizar.
      • ports: Mapea el puerto 80 del contenedor al puerto 80 del host.
      • volumes: Mapea el directorio local ./html al directorio del contenedor /usr/share/nginx/html.
    • db: Define el servicio de la base de datos.
      • image: Especifica la imagen de Docker a utilizar.
      • environment: Define variables de entorno para configurar la base de datos.
      • volumes: Mapea un volumen Docker llamado db_data al directorio del contenedor /var/lib/mysql.
  • volumes: Define volúmenes Docker que pueden ser utilizados por los servicios.

Ejecutando Aplicaciones Multi-Contenedor

Para ejecutar la aplicación definida en el archivo docker-compose.yml, utiliza el siguiente comando:

docker-compose up

Este comando:

  • Descargará las imágenes de Docker especificadas si no están disponibles localmente.
  • Creará y ejecutará los contenedores definidos en el archivo docker-compose.yml.
  • Mostrará los logs de los contenedores en la terminal.

Para ejecutar los contenedores en segundo plano (detached mode), utiliza el siguiente comando:

docker-compose up -d

Gestionando Aplicaciones Multi-Contenedor

Ver el Estado de los Servicios

Para ver el estado de los servicios, utiliza el siguiente comando:

docker-compose ps

Detener los Servicios

Para detener los servicios, utiliza el siguiente comando:

docker-compose down

Este comando detendrá y eliminará los contenedores, redes y volúmenes definidos en el archivo docker-compose.yml.

Ejemplo Práctico: Aplicación Web con Nginx y MySQL

Vamos a crear una aplicación web simple que utiliza Nginx como servidor web y MySQL como base de datos.

Paso 1: Crear la Estructura del Proyecto

Crea la siguiente estructura de directorios y archivos:

myapp/
├── docker-compose.yml
└── html/
    └── index.html

Paso 2: Definir el Archivo docker-compose.yml

Crea el archivo docker-compose.yml con el siguiente contenido:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: exampledb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Paso 3: Crear el Archivo index.html

Crea el archivo index.html en el directorio html con el siguiente contenido:

<!DOCTYPE html>
<html>
<head>
    <title>My App</title>
</head>
<body>
    <h1>Welcome to My App!</h1>
</body>
</html>

Paso 4: Ejecutar la Aplicación

Navega al directorio myapp y ejecuta el siguiente comando:

docker-compose up

Abre un navegador web y navega a http://localhost. Deberías ver la página web con el mensaje "Welcome to My App!".

Ejercicio Práctico

Ejercicio

Crea una aplicación multi-contenedor que incluya un servidor web (Nginx) y un servicio de caché (Redis). El servidor web debe servir una página HTML que muestre un mensaje de bienvenida.

Solución

  1. Crea la estructura del proyecto:
myapp/
├── docker-compose.yml
└── html/
    └── index.html
  1. Define el archivo docker-compose.yml:
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  cache:
    image: redis:latest
  1. Crea el archivo index.html en el directorio html:
<!DOCTYPE html>
<html>
<head>
    <title>My App with Redis</title>
</head>
<body>
    <h1>Welcome to My App with Redis!</h1>
</body>
</html>
  1. Ejecuta la aplicación:
docker-compose up

Abre un navegador web y navega a http://localhost. Deberías ver la página web con el mensaje "Welcome to My App with Redis!".

Conclusión

En esta sección, hemos aprendido cómo definir y gestionar aplicaciones multi-contenedor utilizando Docker Compose. Hemos visto cómo crear un archivo docker-compose.yml para definir múltiples servicios y cómo ejecutar y gestionar estos servicios. Con estos conocimientos, puedes empezar a construir y desplegar aplicaciones más complejas utilizando Docker Compose.

© Copyright 2024. Todos los derechos reservados