Tutorial Completo de Docker Compose
¿Qué es Docker Compose?
Docker Compose es una herramienta que permite definir y ejecutar múltiples contenedores en conjunto mediante un archivo docker-compose.yml. Facilita la administración de entornos complejos, como aplicaciones con bases de datos, servidores web y microservicios.
Comando básico:
docker-compose up -d
Docker Compose vs Dockerfile: ¿Cuál es la diferencia?
| Característica | Docker Compose (docker-compose.yml) | Dockerfile |
|---|---|---|
| ¿Qué hace? | Orquesta múltiples contenedores | Define la imagen de un contenedor |
| Uso principal | Ejecutar y administrar varios servicios | Crear imágenes personalizadas |
| Se usa con… | Contenedores existentes o imágenes personalizadas | Docker para construir imágenes |
| Ejemplo | Levantar app con Nginx, MySQL y PHP | Crear imagen de PHP con dependencias |
¿Se pueden usar juntos?
Sí, y es una buena práctica combinarlos. Usas Dockerfile para definir imágenes personalizadas y Docker Compose para orquestar la aplicación con otros servicios.
Ejemplo Práctico: Dockerfile + Docker Compose
1. Crear un Dockerfile para aplicación PHP
# Usar una imagen base de PHP con Apache FROM php:8.1-apache # Instalar extensiones necesarias RUN docker-php-ext-install mysqli pdo pdo_mysql # Copiar el código fuente de la aplicación al contenedor COPY ./src /var/www/html # Exponer el puerto 80 EXPOSE 80
2. Crear un docker-compose.yml
version: "3.8" services: web: build: . ports: - "8080:80" depends_on: - db volumes: - ./src:/var/www/html db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: miapp MYSQL_USER: usuario MYSQL_PASSWORD: clave volumes: - db_data:/var/lib/mysql volumes: db_data:
3. Ejecutar la aplicación
docker-compose up --build -d
Ejemplo Completo: Servidor Nginx con Docker Compose
📂 Estructura del proyecto
mi-servidor-nginx/
├── docker-compose.yml
├── nginx.conf
└── html/
└── index.htmlArchivo 1: docker-compose.yml
version: '3.8' services: nginx: image: nginx:latest container_name: mi-nginx ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/nginx.conf restart: always
📌 Explicación:
image: nginx:latest→ Usa la imagen oficial de Nginxcontainer_name: mi-nginx→ Nombre del contenedorports: "8080:80"→ Mapea puerto 80 del contenedor al 8080 del hostvolumes→ Monta carpetas y configuración personalizadarestart: always→ Reinicia si el contenedor se detiene
Archivo 2: nginx.conf
events {} http { server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } } }
Archivo 3: index.html
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Servidor Nginx con Docker</title> </head> <body> <h1>¡Hola, Docker!</h1> <p>Este servidor Nginx está corriendo en un contenedor.</p> </body> </html>
🚀 Comandos para ejecutar
1. Crear y ejecutar el proyecto
# Crear carpeta del proyecto mkdir mi-servidor-nginx && cd mi-servidor-nginx # Crear estructura de archivos touch docker-compose.yml nginx.conf mkdir html # Mover index.html a la carpeta html # (crea el archivo index.html con el contenido anterior) # Ejecutar con Docker Compose docker-compose up -d
2. Verificar el contenedor
docker ps
3. Probar en el navegador
Visita: http://localhost:8080
4. Comandos útiles de Docker Compose
# Detener contenedores docker-compose down # Ver logs docker-compose logs # Reconstruir y reiniciar docker-compose up --build # Listar contenedores en ejecución docker-compose ps # Escalar un servicio docker-compose up -d --scale nginx=3 # Reiniciar servicio docker-compose restart
5. Detener y limpiar
# Detener y eliminar contenedores docker-compose down # Eliminar contenedores y volúmenes docker-compose down --volumes
🎯 Conclusión
Docker Compose te permite:
✅ Definir toda la infraestructura en un solo archivo
✅ Gestionar múltiples servicios fácilmente
✅ Configurar redes, volúmenes y dependencias
✅ Escalar servicios según necesidad
Combinación ideal:
Usa Dockerfile para imágenes personalizadas
Usa Docker Compose para orquestar múltiples servicios
Tutorial de Docker Compose
¿Qué es Docker Compose?
Docker Compose es una herramienta que permite definir y ejecutar aplicaciones Docker multi-contenedor. Usando un archivo YAML, puedes configurar todos los servicios de tu aplicación y luego iniciarlos con un solo comando.
Instalación
Verificar instalación
docker-compose --version
Si no lo tienes instalado, sigue las instrucciones en la documentación oficial de Docker.
Conceptos Básicos
docker-compose.yml: Archivo de configuración donde defines los servicios, redes y volúmenes
Servicio: Un contenedor en ejecución
Proyecto: Conjunto de servicios que trabajan juntos
Estructura Básica de docker-compose.yml
version: '3.8' services: # Definición de servicios web: image: nginx:latest ports: - "80:80" database: image: postgres:13 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password
Ejemplo Práctico: Aplicación Web con Base de Datos
Estructura del proyecto
mi-proyecto/
├── docker-compose.yml
├── app/
│ └── index.html
└── nginx/
└── nginx.confdocker-compose.yml completo
version: '3.8' services: # Servicio de base de datos PostgreSQL database: image: postgres:13 container_name: myapp_db environment: POSTGRES_DB: myapp POSTGRES_USER: admin POSTGRES_PASSWORD: secret ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data networks: - app-network # Servicio de aplicación web web: build: ./app container_name: myapp_web ports: - "5000:5000" depends_on: - database environment: DATABASE_URL: postgresql://admin:secret@database:5432/myapp networks: - app-network volumes: - ./app:/app # Servicio de proxy reverso Nginx nginx: image: nginx:alpine container_name: myapp_nginx ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./app:/usr/share/nginx/html depends_on: - web networks: - app-network # Volúmenes para persistencia de datos volumes: db_data: # Redes para comunicación entre contenedores networks: app-network: driver: bridge
Dockerfile para la aplicación web (app/Dockerfile)
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]
requirements.txt
flask==2.0.1 psycopg2-binary==2.9.1
app.py
from flask import Flask import psycopg2 import os app = Flask(__name__) @app.route('/') def hello(): try: # Conexión a la base de datos usando el nombre del servicio conn = psycopg2.connect( host="database", database="myapp", user="admin", password="secret" ) return "¡Aplicación funcionando con base de datos PostgreSQL!" except Exception as e: return f"Error conectando a la base de datos: {str(e)}" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
nginx/nginx.conf
events { worker_connections 1024; } http { upstream webapp { server web:5000; } server { listen 80; location / { proxy_pass http://webapp; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /usr/share/nginx/html/; } } }
Comandos Esenciales de Docker Compose
Iniciar servicios
# Iniciar en segundo plano docker-compose up -d # Iniciar y reconstruir imágenes docker-compose up --build # Iniciar solo servicios específicos docker-compose up web database -d
Ver estado de los servicios
# Listar contenedores del proyecto docker-compose ps # Ver logs docker-compose logs docker-compose logs web docker-compose logs -f # Seguir logs en tiempo real
Detener servicios
# Detener servicios docker-compose down # Detener y eliminar volúmenes docker-compose down -v # Detener servicios específicos docker-compose stop web
Gestión de servicios
# Ejecutar comandos en un contenedor docker-compose exec database psql -U admin -d myapp # Escalar servicios docker-compose up --scale web=3 -d # Ver uso de recursos docker-compose top
Características Avanzadas
Variables de Entorno
version: '3.8' services: web: build: . environment: - DATABASE_URL=${DATABASE_URL} env_file: - .env
Health Checks
services: database: image: postgres:13 healthcheck: test: ["CMD-SHELL", "pg_isready -U admin -d myapp"] interval: 30s timeout: 10s retries: 3
Dependencias entre servicios
services: web: build: . depends_on: database: condition: service_healthy
Configuraciones y Secretos
services: web: image: nginx configs: - source: nginx_config target: /etc/nginx/nginx.conf configs: nginx_config: file: ./nginx.conf
Ejemplo de Desarrollo con Hot Reload
version: '3.8' services: web: build: . ports: - "3000:3000" volumes: - .:/app - /app/node_modules environment: - NODE_ENV=development command: npm run dev
Mejores Prácticas
Usa versiones específicas de imágenes: Evita
latestUtiliza .dockerignore: Excluye archivos innecesarios
Maneja logs apropiadamente: Configura rotación de logs
Usa variables de entorno: Para configuraciones sensibles
Optimiza el orden de las capas: En Dockerfiles
Utiliza redes específicas: Para aislar servicios
Comandos Útiles para Desarrollo
# Reconstruir y reiniciar un servicio específico docker-compose up -d --build web # Ver recursos utilizados docker-compose stats # Eliminar contenedores detenidos docker-compose rm # Listar imágenes del proyecto docker-compose images # Pausar/Reanudar servicios docker-compose pause docker-compose unpause
Troubleshooting
Problemas comunes y soluciones:
# Si los puertos están en uso docker-compose down # o cambia los puertos en docker-compose.yml # Si hay problemas de permisos con volúmenes docker-compose down -v docker-compose up # Ver información detallada de un servicio docker-compose logs web --tail=50 -f
Este tutorial te proporciona una base sólida para trabajar con Docker Compose. ¡Practica con estos ejemplos y explora la documentación oficial para profundizar!
Comentarios
Publicar un comentario