5. Docker Compose
Docker Compose es una herramienta que permite definir y gestionar múltiples contenedores como un solo servicio. Esto se realiza mediante un archivo docker-compose.yml, en el que se describe la configuración completa del entorno, facilitando despliegues repetibles, organizados y portables.
¿Por qué usar Docker Compose?
- Automatiza la creación de redes, volúmenes y múltiples contenedores
- Facilita el manejo de entornos de desarrollo
- Permite lanzar un sistema completo con un solo comando
- Muy útil para stacks con varios servicios (por ejemplo: backend, base de datos y frontend)
Sintaxis básica del archivo docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
app:
build: .
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: usuario
POSTGRES_PASSWORD: contraseña
volumes:
datos_db:
Comandos principales
docker compose up # Levanta todo
docker compose down # Detiene y elimina contenedores y redes
docker compose build # Construye las imágenes
docker compose logs -f # Ver logs en vivo
docker compose exec app bash # Accede al contenedor app
Nota: A partir de Docker v20.10+, se recomienda usar
docker compose(sin guion), aunquedocker-composeaún es válido.
Variables de entorno
Puedes usar un archivo .env para definir valores reutilizables:
Archivo .env:
POSTGRES_USER=usuario
POSTGRES_PASSWORD=contraseña
PUERTO_EXTERNO=8080
Y luego usarlos en el YAML:
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- "${PUERTO_EXTERNO}:80"
El archivo .env debe estar en el mismo directorio que el docker-compose.yml. Puedes versionarlo parcialmente, excluyendo claves sensibles con .gitignore.
Redes personalizadas
Docker Compose crea una red por defecto, pero puedes definir otras:
networks:
red_interna:
driver: bridge
services:
app:
networks:
- red_interna
Montaje de volúmenes
Para mantener persistencia de datos o facilitar el desarrollo:
volumes:
- ./datos:/var/lib/postgresql/data
Esto enlaza un directorio local con uno dentro del contenedor.
Ejemplo completo de stack
version: '3.8'
services:
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: ejemplo123
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: ejemplo123
depends_on:
- db
volumes:
db_data:
Consejos prácticos
- Usa
.dockerignorepara excluir archivos innecesarios - Estructura tu proyecto con carpetas separadas por servicio
- No guardes credenciales en texto plano; usa
.envy.gitignore - Puedes usar perfiles para servicios opcionales (
profiles:) - La línea de
version: 'x.x'no es necesaria ni recomendada desde la versión 1.27.0 de Docker Compose
Herramientas relacionadas
- Docker Compose CLI (v2) – Comando
docker compose - Compose Specification – Documentación oficial del formato YAML