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
.
- web: Define el servicio del servidor web.
- 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:
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:
Gestionando Aplicaciones Multi-Contenedor
Ver el Estado de los Servicios
Para ver el estado de los servicios, utiliza el siguiente comando:
Detener los Servicios
Para detener los servicios, utiliza el siguiente comando:
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:
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:
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
- Crea la estructura del proyecto:
- 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
- Crea el archivo
index.html
en el directoriohtml
:
<!DOCTYPE html> <html> <head> <title>My App with Redis</title> </head> <body> <h1>Welcome to My App with Redis!</h1> </body> </html>
- Ejecuta la aplicación:
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.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga