cd ../blogArchivo básico
docker-y-docker-compose.md
$ cat docker-y-docker-compose.md
Docker y Docker Compose
5 de abril de 2026
dockerdocker-compose
Docker y Docker Compose
¿Qué son?
Docker es una plataforma de contenedores que permite empaquetar aplicaciones y sus dependencias en unidades estandarizadas llamadas contenedores.
Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor usando un archivo YAML.
Ventajas en el Desarrollo de Software
🔄 Consistencia entre entornos
- Elimina el "funciona en mi máquina"
- Mismo entorno desde desarrollo hasta producción
⚡ Rápida configuración
- Levantar entornos complejos con un solo comando
- Eliminar horas de configuración manual
📦 Aislamiento
- Cada servicio (BD, backend, frontend) en su contenedor
- Sin conflictos de versiones o dependencias
🚀 Productividad
- Integración continua simplificada
- Onboarding rápido de nuevos desarrolladores
💾 Eficiencia de recursos
- Más livianos que máquinas virtuales
- Comparten el kernel del sistema operativo
🔧 Escalabilidad
- Fácil replicar servicios
- Ideal para microservicios
Comandos Principales de Docker
Gestión de Contenedores
# Ejecutar un contenedor
docker run nginx
# Ejecutar en modo detached (background)
docker run -d nginx
# Listar contenedores activos
docker ps
# Listar todos los contenedores (incluyendo detenidos)
docker ps -a
# Detener un contenedor
docker stop <id>
# Iniciar un contenedor detenido
docker start <id>
# Reiniciar un contenedor
docker restart <id>
# Eliminar un contenedor
docker rm <id>
# Eliminar contenedor forzosamente
docker rm -f <id>
Gestión de Imágenes
# Listar imágenes locales
docker images
# Descargar una imagen
docker pull ubuntu:latest
# Construir una imagen desde Dockerfile
docker build -t mi-app:1.0 .
# Eliminar una imagen
docker rmi <image-id>
# Ver historial de capas de una imagen
docker history <image-name>
Logs y Debugging
# Ver logs de un contenedor
docker logs <id>
# Ver logs en tiempo real
docker logs -f <id>
# Ejecutar comando dentro de contenedor en ejecución
docker exec -it <id> bash
# Ver procesos dentro del contenedor
docker top <id>
# Ver estadísticas de recursos
docker stats
Networking y Volúmenes
# Listar redes
docker network ls
# Crear red personalizada
docker network create mi-red
# Listar volúmenes
docker volume ls
# Crear volumen
docker volume create mi-volumen
Limpieza
# Eliminar contenedores detenidos
docker container prune
# Eliminar imágenes no utilizadas
docker image prune
# Eliminar todo (contenedores, redes, volúmenes no usados)
docker system prune -a
Comandos de Docker Compose
Archivo básico docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
environment:
- NODE_ENV=development
database:
image: postgres:14
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
Comandos esenciales
# Levantar todos los servicios (modo detached)
docker-compose up -d
# Levantar y reconstruir imágenes
docker-compose up -d --build
# Ver servicios activos
docker-compose ps
# Ver logs de todos los servicios
docker-compose logs
# Ver logs de un servicio específico
docker-compose logs web
# Detener servicios (mantiene contenedores)
docker-compose stop
# Detener y eliminar contenedores
docker-compose down
# Detener y eliminar también volúmenes
docker-compose down -v
# Reiniciar servicios
docker-compose restart
# Ejecutar comando en un servicio
docker-compose exec web npm install
# Verificar sintaxis del compose file
docker-compose config
# Escalar un servicio
docker-compose up -d --scale web=3
Ejemplo Práctico: Aplicación Node.js + PostgreSQL
Estructura del proyecto
mi-app/
├── Dockerfile
├── docker-compose.yml
├── package.json
└── index.js
Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DB_HOST=db
- DB_USER=postgres
- DB_PASSWORD=secret
- DB_NAME=myapp
volumes:
- .:/app
- /app/node_modules
db:
image: postgres:14-alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Comandos para este proyecto
# Primera vez: construir y levantar
docker-compose up -d --build
# Ver logs de la app
docker-compose logs -f app
# Acceder a la base de datos
docker-compose exec db psql -U postgres -d myapp
# Detener todo
docker-compose down
Mejores Prácticas
- Usar
.dockerignore- Evita copiar archivos innecesarios - Imágenes pequeñas - Prefiere
alpinecuando sea posible - Un proceso por contenedor - No ejecutes múltiples servicios
- Versiones específicas - Usa tags específicos, no
latest - Volúmenes para datos - No guardes datos dentro del contenedor
- Variables de entorno - No hardcodees configuraciones
- Healthchecks - Configura verificaciones de salud
Recursos Útiles
- Documentación oficial de Docker
- Docker Hub - Repositorio de imágenes
- Play with Docker - Laboratorio interactivo