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 --versionSi 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: passwordEjemplo 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: bridgeDockerfile 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.1app.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 -dVer 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 realDetener servicios
# Detener servicios
docker-compose down
# Detener y eliminar volúmenes
docker-compose down -v
# Detener servicios específicos
docker-compose stop webGestió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 topCaracterísticas Avanzadas
Variables de Entorno
version: '3.8'
services:
web:
build: .
environment:
- DATABASE_URL=${DATABASE_URL}
env_file:
- .envHealth Checks
services:
database:
image: postgres:13
healthcheck:
test: ["CMD-SHELL", "pg_isready -U admin -d myapp"]
interval: 30s
timeout: 10s
retries: 3Dependencias entre servicios
services:
web:
build: .
depends_on:
database:
condition: service_healthyConfiguraciones y Secretos
services:
web:
image: nginx
configs:
- source: nginx_config
target: /etc/nginx/nginx.conf
configs:
nginx_config:
file: ./nginx.confEjemplo 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 devMejores 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 unpauseTroubleshooting
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 -fEste tutorial te proporciona una base sólida para trabajar con Docker Compose. ¡Practica con estos ejemplos y explora la documentación oficial para profundiza
Comentarios
Publicar un comentario